Chromium Code Reviews| Index: chrome/browser/predictors/resource_prefetch_predictor_tables.cc |
| diff --git a/chrome/browser/predictors/resource_prefetch_predictor_tables.cc b/chrome/browser/predictors/resource_prefetch_predictor_tables.cc |
| index 75cfb3942947b5820fb761d5309cb80159e00c25..9202271649c123c8d00c60bb03331157274a2e20 100644 |
| --- a/chrome/browser/predictors/resource_prefetch_predictor_tables.cc |
| +++ b/chrome/browser/predictors/resource_prefetch_predictor_tables.cc |
| @@ -24,6 +24,8 @@ using sql::Statement; |
| namespace { |
| using ResourceRow = predictors::ResourcePrefetchPredictorTables::ResourceRow; |
| +using RedirectStatRow = |
| + predictors::ResourcePrefetchPredictorTables::RedirectStatRow; |
| const char kMetadataTableName[] = "resource_prefetch_predictor_metadata"; |
| const char kUrlResourceTableName[] = "resource_prefetch_predictor_url"; |
| @@ -68,6 +70,12 @@ void BindResourceRowToStatement(const ResourceRow& row, |
| statement->BindBlob(2, &proto_buffer[0], size); |
| } |
| +void BindRedirectStatRowToStatement(const RedirectStatRow& row, |
| + const std::string& primary_key, |
| + Statement* statement) { |
| + |
| +} |
| + |
| bool StepAndInitializeResourceRow(Statement* statement, |
| ResourceRow* row, |
| std::string* primary_key) { |
| @@ -231,27 +239,61 @@ bool ResourcePrefetchPredictorTables::PrefetchData::operator==( |
| resources == rhs.resources; |
| } |
| +RedirectStatRow::RedirectStatRow() |
| + : number_of_hits(0), |
| + number_of_misses(0), |
| + consecutive_misses(0) {} |
| + |
| +RedirectStatRow::RedirectStatRow(const RedirectStatRow& other) |
| + : final_redirect(other.final_redirect), |
| + number_of_hits(other.number_of_hits), |
| + number_of_misses(other.number_of_misses), |
| + consecutive_misses(other.consecutive_misses) {} |
| + |
| +ResourcePrefetchPredictorTables::RedirectData::RedirectData( |
| + PrefetchKeyType i_key_type, |
| + const std::string& i_primary_key) |
| + : key_type(i_key_type), |
| + primary_key(i_primary_key) {} |
| + |
| +ResourcePrefetchPredictorTables::RedirectData::RedirectData( |
| + const RedirectData& other) |
| + : key_type(other.key_type), |
| + primary_key(other.primary_key), |
| + last_visit(other.last_visit), |
| + redirect_stats(other.redirect_stats) {} |
| + |
| +ResourcePrefetchPredictorTables::RedirectData::~RedirectData() { |
| +} |
| + |
| void ResourcePrefetchPredictorTables::GetAllData( |
| PrefetchDataMap* url_data_map, |
| - PrefetchDataMap* host_data_map) { |
| + PrefetchDataMap* host_data_map, |
| + RedirectDataMap* url_redirect_data_map, |
| + RedirectDataMap* host_redirect_data_map) { |
| DCHECK_CURRENTLY_ON(BrowserThread::DB); |
| if (CantAccessDatabase()) |
| return; |
| DCHECK(url_data_map); |
| DCHECK(host_data_map); |
| + DCHECK(url_redirect_data_map); |
| + DCHECK(host_redirect_data_map); |
| url_data_map->clear(); |
| host_data_map->clear(); |
| + url_redirect_data_map->clear(); |
| + host_redirect_data_map->clear(); |
| std::vector<std::string> urls_to_delete, hosts_to_delete; |
| GetAllDataHelper(PREFETCH_KEY_TYPE_URL, url_data_map, &urls_to_delete); |
| GetAllDataHelper(PREFETCH_KEY_TYPE_HOST, host_data_map, &hosts_to_delete); |
| + // TODO: get data from redirect tables |
| if (!urls_to_delete.empty() || !hosts_to_delete.empty()) |
| DeleteData(urls_to_delete, hosts_to_delete); |
| } |
| -void ResourcePrefetchPredictorTables::UpdateData( |
| +void ResourcePrefetchPredictorTables::UpdatePrefetchData( |
| const PrefetchData& url_data, |
| const PrefetchData& host_data) { |
| DCHECK_CURRENTLY_ON(BrowserThread::DB); |
| @@ -263,7 +305,8 @@ void ResourcePrefetchPredictorTables::UpdateData( |
| DB()->BeginTransaction(); |
| - bool success = (url_data.primary_key.empty() || UpdateDataHelper(url_data)) && |
| + bool success = |
| + (url_data.primary_key.empty() || UpdatePrefetchDataHelper(url_data)) && |
| (host_data.primary_key.empty() || UpdateDataHelper(host_data)); |
| if (!success) |
| DB()->RollbackTransaction(); |
| @@ -271,6 +314,21 @@ void ResourcePrefetchPredictorTables::UpdateData( |
| DB()->CommitTransaction(); |
| } |
| +void ResourcePrefetchPredictorTables::UpdateRedirectData( |
| + const RedirectData& redirect_data) { |
| + DCHECK_CURRENTLY_ON(BrowserThread::DB); |
| + if (CantAccessDatabase()) |
| + return; |
| + |
| + DB()->BeginTransaction(); |
| + |
| + bool success = UpdateRedirectDataHelper(redirect_data); |
| + if (!success) |
| + DB()->RollbackTransaction(); |
| + |
| + DB()->CommitTransaction(); |
| +} |
| + |
| void ResourcePrefetchPredictorTables::DeleteData( |
| const std::vector<std::string>& urls, |
| const std::vector<std::string>& hosts) { |
| @@ -364,7 +422,7 @@ void ResourcePrefetchPredictorTables::GetAllDataHelper( |
| } |
| } |
| -bool ResourcePrefetchPredictorTables::UpdateDataHelper( |
| +bool ResourcePrefetchPredictorTables::UpdatePrefetchDataHelper( |
| const PrefetchData& data) { |
| DCHECK(!data.primary_key.empty()); |
| @@ -409,6 +467,36 @@ bool ResourcePrefetchPredictorTables::UpdateDataHelper( |
| return true; |
| } |
| +bool ResourcePrefetchPredictorTables::UpdateRedirectDataHelper( |
| + const RedirectData& data) { |
| + DCHECK(!data.primary_key.empty()); |
| + |
| + if (!StringsAreSmallerThanDBLimit(data)) { |
| + // TODO: UMA? |
|
mattcary
2016/09/09 13:19:21
Yes!
|
| + return false; |
| + } |
| + |
| + // Delete the older data from the table. |
| + std::unique_ptr<Statement> deleter(data.is_host() |
| + ? GetHostRedirectStatDeleteStatement() |
| + : GetUrlRedirectStatDeleteStatement()); |
| + deleter->BindString(0, data.primary_key); |
| + if (!deleter->Run()) |
| + return false; |
| + |
| + // Add the new data to the table. |
| + for (const RedirectStatRow& row : data.redirect_stats) { |
| + std::unique_ptr<Statement> row_inserter( |
| + data.is_host() ? GetHostRedirectStatUpdateStatement() |
| + : GetUrlRedirectStatUpdateStatement()); |
| + BindRedirectStatRowToStatement(row, data.primary_key, row_inserter.get()); |
| + if (!row_inserter->Run()) |
| + return false; |
| + } |
| + |
| + return true; |
| +} |
| + |
| void ResourcePrefetchPredictorTables::DeleteDataHelper( |
| PrefetchKeyType key_type, |
| const std::vector<std::string>& keys) { |
| @@ -442,6 +530,19 @@ bool ResourcePrefetchPredictorTables::StringsAreSmallerThanDBLimit( |
| } |
| // static |
| +bool ResourcePrefetchPredictorTables::StringAreSmallerThanDBLimit( |
| + const RedirectData& data) { |
| + if (data.primary_key.length() > kMaxStringLength) |
| + return false; |
| + |
| + for (const RedirectStatRow& row : data.redirect_stats) { |
| + if (row.final_redirect.length() > kMaxStringLength) |
| + return false; |
| + } |
| + return true; |
| +} |
| + |
| +// static |
| bool ResourcePrefetchPredictorTables::DropTablesIfOutdated( |
| sql::Connection* db) { |
| int version = GetDatabaseVersion(db); |