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

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

Issue 2796783004: predictors: Add origin learning. (Closed)
Patch Set: Advancing our amazing database version number. 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 std::string& host,
alexilin 2017/04/10 14:58:28 nit: You could get rid of the host parameter beca
Benoit L 2017/04/11 09:04:05 I retained it for symmetry with the rest of the co
222 const OriginData& origin_data) {
223 DCHECK_CURRENTLY_ON(BrowserThread::DB);
224 if (CantAccessDatabase())
225 return;
226
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});
alexilin 2017/04/10 14:58:28 Add `DCHECK_EQ(data.host(), key)`
Benoit L 2017/04/11 09:04:05 Done.
384 }
385
319 bool ResourcePrefetchPredictorTables::UpdateDataHelper( 386 bool ResourcePrefetchPredictorTables::UpdateDataHelper(
320 PrefetchKeyType key_type, 387 PrefetchKeyType key_type,
321 PrefetchDataType data_type, 388 PrefetchDataType data_type,
322 const std::string& key, 389 const std::string& key,
323 const MessageLite& data) { 390 const MessageLite& data) {
324 // Delete the older data from the table. 391 // Delete the older data from the table.
325 std::unique_ptr<sql::Statement> deleter( 392 std::unique_ptr<sql::Statement> deleter(
326 GetTableUpdateStatement(key_type, data_type, TableOperationType::REMOVE)); 393 GetTableUpdateStatement(key_type, data_type, TableOperationType::REMOVE));
327 deleter->BindString(0, key); 394 deleter->BindString(0, key);
328 if (!deleter->Run()) 395 if (!deleter->Run())
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after
385 default: 452 default:
386 type_multiplier = 1; 453 type_multiplier = 1;
387 } 454 }
388 455
389 constexpr int kMaxResourcesPerType = 100; 456 constexpr int kMaxResourcesPerType = 100;
390 return kMaxResourcesPerType * 457 return kMaxResourcesPerType *
391 (priority_multiplier * 100 + type_multiplier * 10) - 458 (priority_multiplier * 100 + type_multiplier * 10) -
392 data.average_position(); 459 data.average_position();
393 } 460 }
394 461
462 float ResourcePrefetchPredictorTables::ComputeOriginScore(
463 const OriginStat& origin) {
464 // The ranking is done by considering, in this order:
465 // 1. High confidence resources (>75% and more than 10 hits)
466 // 2. Mandatory network access
467 // 3. Network accessed
468 // 4. Average position (decreasing)
469 float score = 0;
470 float confidence = static_cast<float>(origin.number_of_hits()) /
471 (origin.number_of_hits() + origin.number_of_misses());
472
473 bool is_high_confidence = confidence > .75 && origin.number_of_hits() > 10;
474 score += is_high_confidence * 1e6;
475
476 score += origin.always_access_network() * 1e4;
477 score += origin.accessed_network() * 1e2;
478 score += 1e2 - origin.average_position();
479
480 return score;
481 }
482
395 // static 483 // static
396 bool ResourcePrefetchPredictorTables::DropTablesIfOutdated( 484 bool ResourcePrefetchPredictorTables::DropTablesIfOutdated(
397 sql::Connection* db) { 485 sql::Connection* db) {
398 int version = GetDatabaseVersion(db); 486 int version = GetDatabaseVersion(db);
399 bool success = true; 487 bool success = true;
400 // Too new is also a problem. 488 // Too new is also a problem.
401 bool incompatible_version = version != kDatabaseVersion; 489 bool incompatible_version = version != kDatabaseVersion;
402 490
403 // These are deprecated tables but they still have to be removed if present. 491 // These are deprecated tables but they still have to be removed if present.
404 static const char kUrlMetadataTableName[] = 492 static const char kUrlMetadataTableName[] =
405 "resource_prefetch_predictor_url_metadata"; 493 "resource_prefetch_predictor_url_metadata";
406 static const char kHostMetadataTableName[] = 494 static const char kHostMetadataTableName[] =
407 "resource_prefetch_predictor_host_metadata"; 495 "resource_prefetch_predictor_host_metadata";
408 496
409 if (incompatible_version) { 497 if (incompatible_version) {
410 for (const char* table_name : 498 for (const char* table_name :
411 {kMetadataTableName, kUrlResourceTableName, kHostResourceTableName, 499 {kMetadataTableName, kUrlResourceTableName, kHostResourceTableName,
412 kUrlRedirectTableName, kHostRedirectTableName, kManifestTableName, 500 kUrlRedirectTableName, kHostRedirectTableName, kManifestTableName,
413 kUrlMetadataTableName, kHostMetadataTableName}) { 501 kUrlMetadataTableName, kHostMetadataTableName, kOriginTableName}) {
414 success = 502 success =
415 success && 503 success &&
416 db->Execute(base::StringPrintf("DROP TABLE IF EXISTS %s", table_name) 504 db->Execute(base::StringPrintf("DROP TABLE IF EXISTS %s", table_name)
417 .c_str()); 505 .c_str());
418 } 506 }
419 } 507 }
420 508
421 if (incompatible_version) { 509 if (incompatible_version) {
422 success = 510 success =
423 success && 511 success &&
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
460 if (CantAccessDatabase()) 548 if (CantAccessDatabase())
461 return; 549 return;
462 550
463 // Database initialization is all-or-nothing. 551 // Database initialization is all-or-nothing.
464 sql::Connection* db = DB(); 552 sql::Connection* db = DB();
465 bool success = db->BeginTransaction(); 553 bool success = db->BeginTransaction();
466 success = success && DropTablesIfOutdated(db); 554 success = success && DropTablesIfOutdated(db);
467 555
468 for (const char* table_name : 556 for (const char* table_name :
469 {kUrlResourceTableName, kHostResourceTableName, kUrlRedirectTableName, 557 {kUrlResourceTableName, kHostResourceTableName, kUrlRedirectTableName,
470 kHostRedirectTableName, kManifestTableName}) { 558 kHostRedirectTableName, kManifestTableName, kOriginTableName}) {
471 success = success && 559 success = success &&
472 (db->DoesTableExist(table_name) || 560 (db->DoesTableExist(table_name) ||
473 db->Execute(base::StringPrintf( 561 db->Execute(base::StringPrintf(
474 kCreateProtoTableStatementTemplate, table_name) 562 kCreateProtoTableStatementTemplate, table_name)
475 .c_str())); 563 .c_str()));
476 } 564 }
477 565
478 if (success) 566 if (success)
479 success = db->CommitTransaction(); 567 success = db->CommitTransaction();
480 else 568 else
(...skipping 23 matching lines...) Expand all
504 statement.ColumnInt(0)); 592 statement.ColumnInt(0));
505 } 593 }
506 594
507 std::unique_ptr<sql::Statement> 595 std::unique_ptr<sql::Statement>
508 ResourcePrefetchPredictorTables::GetTableUpdateStatement( 596 ResourcePrefetchPredictorTables::GetTableUpdateStatement(
509 PrefetchKeyType key_type, 597 PrefetchKeyType key_type,
510 PrefetchDataType data_type, 598 PrefetchDataType data_type,
511 TableOperationType op_type) { 599 TableOperationType op_type) {
512 sql::StatementID id(__FILE__, key_type | (static_cast<int>(data_type) << 1) | 600 sql::StatementID id(__FILE__, key_type | (static_cast<int>(data_type) << 1) |
513 (static_cast<int>(op_type) << 3)); 601 (static_cast<int>(op_type) << 3));
514 const char* statement_template = (op_type == TableOperationType::REMOVE 602 const char* statement_template =
515 ? kDeleteProtoTableStatementTemplate 603 (op_type == TableOperationType::REMOVE ? kDeleteProtoStatementTemplate
516 : kInsertProtoTableStatementTemplate); 604 : kInsertProtoStatementTemplate);
517 const char* table_name = GetTableName(key_type, data_type); 605 const char* table_name = GetTableName(key_type, data_type);
518 return base::MakeUnique<sql::Statement>(DB()->GetCachedStatement( 606 return base::MakeUnique<sql::Statement>(DB()->GetCachedStatement(
519 id, base::StringPrintf(statement_template, table_name).c_str())); 607 id, base::StringPrintf(statement_template, table_name).c_str()));
520 } 608 }
521 609
522 // static 610 // static
523 const char* ResourcePrefetchPredictorTables::GetTableName( 611 const char* ResourcePrefetchPredictorTables::GetTableName(
524 PrefetchKeyType key_type, 612 PrefetchKeyType key_type,
525 PrefetchDataType data_type) { 613 PrefetchDataType data_type) {
526 bool is_host = key_type == PREFETCH_KEY_TYPE_HOST; 614 bool is_host = key_type == PREFETCH_KEY_TYPE_HOST;
527 switch (data_type) { 615 switch (data_type) {
528 case PrefetchDataType::RESOURCE: 616 case PrefetchDataType::RESOURCE:
529 return is_host ? kHostResourceTableName : kUrlResourceTableName; 617 return is_host ? kHostResourceTableName : kUrlResourceTableName;
530 case PrefetchDataType::REDIRECT: 618 case PrefetchDataType::REDIRECT:
531 return is_host ? kHostRedirectTableName : kUrlRedirectTableName; 619 return is_host ? kHostRedirectTableName : kUrlRedirectTableName;
532 case PrefetchDataType::MANIFEST: 620 case PrefetchDataType::MANIFEST:
533 return kManifestTableName; 621 return kManifestTableName;
622 case PrefetchDataType::ORIGIN:
623 return kOriginTableName;
534 } 624 }
535 625
536 NOTREACHED(); 626 NOTREACHED();
537 return nullptr; 627 return nullptr;
538 } 628 }
539 629
540 } // namespace predictors 630 } // namespace predictors
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698