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 982e1972e2ec7fb721267ef1e52c242833a87ba9..ab3a097b599836c9c3b8bc92978a6ebd463fc736 100644 |
| --- a/chrome/browser/predictors/resource_prefetch_predictor_tables.cc |
| +++ b/chrome/browser/predictors/resource_prefetch_predictor_tables.cc |
| @@ -24,13 +24,18 @@ using sql::Statement; |
| namespace { |
| using ResourceData = predictors::ResourceData; |
| +using RedirectData = predictors::RedirectData; |
| const char kMetadataTableName[] = "resource_prefetch_predictor_metadata"; |
| -const char kUrlResourceTableName[] = "resource_prefetch_predictor_url"; |
| +const char kUrlResourceTableName[] = "resource_prefetch_predictor_url_resource"; |
| const char kUrlMetadataTableName[] = "resource_prefetch_predictor_url_metadata"; |
| -const char kHostResourceTableName[] = "resource_prefetch_predictor_host"; |
| +const char kUrlRedirectTableName[] = "resource_prefetch_predictor_url_redirect"; |
| +const char kHostResourceTableName[] = |
| + "resource_prefetch_predictor_host_resource"; |
| const char kHostMetadataTableName[] = |
| "resource_prefetch_predictor_host_metadata"; |
| +const char kHostRedirectTableName[] = |
| + "resource_prefetch_predictor_host_redirect"; |
| const char kCreateGlobalMetadataStatementTemplate[] = |
| "CREATE TABLE %s ( " |
| @@ -47,9 +52,16 @@ const char kCreateMetadataTableStatementTemplate[] = |
| "main_page_url TEXT, " |
| "last_visit_time INTEGER, " |
| "PRIMARY KEY(main_page_url))"; |
| +const char kCreateRedirectTableStatementTemplate[] = |
| + "CREATE TABLE %s ( " |
| + "main_page_url TEXT, " |
|
Benoit L
2016/09/26 11:18:36
Would this be "initial_url" instead?
alexilin
2016/09/26 12:14:54
Yeah, but then we will have to have two different
|
| + "proto BLOB, " |
| + "PRIMARY KEY(main_page_url))"; |
| const char kInsertResourceTableStatementTemplate[] = |
| "INSERT INTO %s (main_page_url, resource_url, proto) VALUES (?,?,?)"; |
| +const char kInsertRedirectTableStatementTemplate[] = |
| + "INSERT INTO %s (main_page_url, proto) VALUES (?,?)"; |
| const char kInsertMetadataTableStatementTemplate[] = |
| "INSERT INTO %s (main_page_url, last_visit_time) VALUES (?,?)"; |
| const char kDeleteStatementTemplate[] = "DELETE FROM %s WHERE main_page_url=?"; |
| @@ -67,6 +79,17 @@ void BindResourceDataToStatement(const ResourceData& data, |
| statement->BindBlob(2, &proto_buffer[0], size); |
| } |
| +void BindRedirectDataToStatement(const RedirectData& data, |
| + Statement* statement) { |
| + int size = data.ByteSize(); |
| + DCHECK(size > 0); |
| + std::vector<char> proto_buffer(size); |
| + data.SerializeToArray(&proto_buffer[0], size); |
| + |
| + statement->BindString(0, data.primary_key()); |
| + statement->BindBlob(1, &proto_buffer[0], size); |
| +} |
| + |
| bool StepAndInitializeResourceData(Statement* statement, |
| ResourceData* data, |
| std::string* primary_key) { |
| @@ -74,7 +97,6 @@ bool StepAndInitializeResourceData(Statement* statement, |
| return false; |
| *primary_key = statement->ColumnString(0); |
| - |
| int size = statement->ColumnByteLength(2); |
| const void* blob = statement->ColumnBlob(2); |
| DCHECK(blob); |
| @@ -86,6 +108,24 @@ bool StepAndInitializeResourceData(Statement* statement, |
| return true; |
| } |
| +bool StepAndInitializeRedirectData(Statement* statement, |
| + RedirectData* data, |
| + std::string* primary_key) { |
| + if (!statement->Step()) |
| + return false; |
| + |
| + *primary_key = statement->ColumnString(0); |
| + |
| + int size = statement->ColumnByteLength(1); |
| + const void* blob = statement->ColumnBlob(1); |
| + DCHECK(blob); |
| + data->ParseFromArray(blob, size); |
| + |
| + DCHECK(data->primary_key() == *primary_key); |
| + |
| + return true; |
| +} |
| + |
| } // namespace |
| namespace predictors { |
| @@ -93,11 +133,18 @@ namespace predictors { |
| // static |
| void ResourcePrefetchPredictorTables::SortResources( |
| std::vector<ResourceData>* resources) { |
| - // Sort indices instead of ResourceData objects and then apply resulting |
| - // permutation to the resources. |
| std::sort(resources->begin(), resources->end(), |
| [](const ResourceData& x, const ResourceData& y) { |
| - return ComputeScore(x) > ComputeScore(y); |
| + return ComputeResourceScore(x) > ComputeResourceScore(y); |
| + }); |
| +} |
| + |
| +// static |
| +void ResourcePrefetchPredictorTables::SortRedirects( |
| + std::vector<RedirectStat>* redirects) { |
| + std::sort(redirects->begin(), redirects->end(), |
| + [](const RedirectStat& x, const RedirectStat& y) { |
| + return ComputeRedirectScore(x) > ComputeRedirectScore(y); |
| }); |
| } |
| @@ -121,45 +168,91 @@ ResourcePrefetchPredictorTables::PrefetchData::~PrefetchData() { |
| 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); |
| + GetAllResourceDataHelper(PREFETCH_KEY_TYPE_URL, url_data_map, |
| + &urls_to_delete); |
| + GetAllResourceDataHelper(PREFETCH_KEY_TYPE_HOST, host_data_map, |
| + &hosts_to_delete); |
| + GetAllRedirectDataHelper(PREFETCH_KEY_TYPE_URL, url_redirect_data_map); |
| + GetAllRedirectDataHelper(PREFETCH_KEY_TYPE_HOST, host_redirect_data_map); |
| if (!urls_to_delete.empty() || !hosts_to_delete.empty()) |
| - DeleteData(urls_to_delete, hosts_to_delete); |
| + DeleteResourceData(urls_to_delete, hosts_to_delete); |
| } |
| void ResourcePrefetchPredictorTables::UpdateData( |
| const PrefetchData& url_data, |
| - const PrefetchData& host_data) { |
| + const PrefetchData& host_data, |
| + const RedirectData& url_redirect_data, |
| + const RedirectData& host_redirect_data) { |
| DCHECK_CURRENTLY_ON(BrowserThread::DB); |
| if (CantAccessDatabase()) |
| return; |
| DCHECK(!url_data.is_host() && host_data.is_host()); |
| - DCHECK(!url_data.primary_key.empty() || !host_data.primary_key.empty()); |
| + DCHECK(!url_data.primary_key.empty() || !host_data.primary_key.empty() || |
| + url_redirect_data.has_primary_key() || |
| + host_redirect_data.has_primary_key()); |
| DB()->BeginTransaction(); |
| - bool success = (url_data.primary_key.empty() || UpdateDataHelper(url_data)) && |
| - (host_data.primary_key.empty() || UpdateDataHelper(host_data)); |
| + bool success = |
| + (url_data.primary_key.empty() || |
| + UpdateResourceDataHelper(PREFETCH_KEY_TYPE_URL, url_data)) && |
| + (host_data.primary_key.empty() || |
| + UpdateResourceDataHelper(PREFETCH_KEY_TYPE_HOST, host_data)) && |
| + (!url_redirect_data.has_primary_key() || |
| + UpdateRedirectDataHelper(PREFETCH_KEY_TYPE_URL, url_redirect_data)) && |
| + (!host_redirect_data.has_primary_key() || |
| + UpdateRedirectDataHelper(PREFETCH_KEY_TYPE_HOST, host_redirect_data)); |
| if (!success) |
| DB()->RollbackTransaction(); |
| + else |
| + DB()->CommitTransaction(); |
| +} |
| - DB()->CommitTransaction(); |
| +void ResourcePrefetchPredictorTables::DeleteResourceData( |
| + const std::vector<std::string>& urls, |
| + const std::vector<std::string>& hosts) { |
| + DCHECK_CURRENTLY_ON(BrowserThread::DB); |
| + if (CantAccessDatabase()) |
| + return; |
| + |
| + DCHECK(!urls.empty() || !hosts.empty()); |
| + |
| + if (!urls.empty()) |
| + DeleteResourceDataHelper(PREFETCH_KEY_TYPE_URL, urls); |
| + if (!hosts.empty()) |
| + DeleteResourceDataHelper(PREFETCH_KEY_TYPE_HOST, hosts); |
| } |
| -void ResourcePrefetchPredictorTables::DeleteData( |
| +void ResourcePrefetchPredictorTables::DeleteSingleResourceDataPoint( |
| + const std::string& key, |
| + PrefetchKeyType key_type) { |
| + DCHECK_CURRENTLY_ON(BrowserThread::DB); |
| + if (CantAccessDatabase()) |
| + return; |
| + |
| + DeleteResourceDataHelper(key_type, {key}); |
| +} |
| + |
| +void ResourcePrefetchPredictorTables::DeleteRedirectData( |
| const std::vector<std::string>& urls, |
| const std::vector<std::string>& hosts) { |
| DCHECK_CURRENTLY_ON(BrowserThread::DB); |
| @@ -169,19 +262,19 @@ void ResourcePrefetchPredictorTables::DeleteData( |
| DCHECK(!urls.empty() || !hosts.empty()); |
| if (!urls.empty()) |
| - DeleteDataHelper(PREFETCH_KEY_TYPE_URL, urls); |
| + DeleteRedirectDataHelper(PREFETCH_KEY_TYPE_URL, urls); |
| if (!hosts.empty()) |
| - DeleteDataHelper(PREFETCH_KEY_TYPE_HOST, hosts); |
| + DeleteRedirectDataHelper(PREFETCH_KEY_TYPE_HOST, hosts); |
| } |
| -void ResourcePrefetchPredictorTables::DeleteSingleDataPoint( |
| +void ResourcePrefetchPredictorTables::DeleteSingleRedirectDataPoint( |
| const std::string& key, |
| PrefetchKeyType key_type) { |
| DCHECK_CURRENTLY_ON(BrowserThread::DB); |
| if (CantAccessDatabase()) |
| return; |
| - DeleteDataHelper(key_type, std::vector<std::string>(1, key)); |
| + DeleteRedirectDataHelper(key_type, {key}); |
| } |
| void ResourcePrefetchPredictorTables::DeleteAllData() { |
| @@ -190,8 +283,9 @@ void ResourcePrefetchPredictorTables::DeleteAllData() { |
| Statement deleter; |
| for (const char* table_name : |
| - {kUrlResourceTableName, kUrlMetadataTableName, kHostResourceTableName, |
| - kHostMetadataTableName}) { |
| + {kUrlResourceTableName, kUrlMetadataTableName, kUrlRedirectTableName, |
| + kHostResourceTableName, kHostMetadataTableName, |
| + kHostRedirectTableName}) { |
| deleter.Assign(DB()->GetUniqueStatement( |
| base::StringPrintf("DELETE FROM %s", table_name).c_str())); |
| deleter.Run(); |
| @@ -205,7 +299,7 @@ ResourcePrefetchPredictorTables::ResourcePrefetchPredictorTables() |
| ResourcePrefetchPredictorTables::~ResourcePrefetchPredictorTables() { |
| } |
| -void ResourcePrefetchPredictorTables::GetAllDataHelper( |
| +void ResourcePrefetchPredictorTables::GetAllResourceDataHelper( |
| PrefetchKeyType key_type, |
| PrefetchDataMap* data_map, |
| std::vector<std::string>* to_delete) { |
| @@ -235,8 +329,8 @@ void ResourcePrefetchPredictorTables::GetAllDataHelper( |
| // Read the metadata and keep track of entries that have metadata, but no |
| // resource entries, so they can be deleted. |
| - const char* metadata_table_name = is_host ? kHostMetadataTableName : |
| - kUrlMetadataTableName; |
| + const char* metadata_table_name = |
| + is_host ? kHostMetadataTableName : kUrlMetadataTableName; |
| Statement metadata_reader(DB()->GetUniqueStatement( |
| base::StringPrintf("SELECT * FROM %s", metadata_table_name).c_str())); |
| @@ -253,7 +347,26 @@ void ResourcePrefetchPredictorTables::GetAllDataHelper( |
| } |
| } |
| -bool ResourcePrefetchPredictorTables::UpdateDataHelper( |
| +void ResourcePrefetchPredictorTables::GetAllRedirectDataHelper( |
| + PrefetchKeyType key_type, |
| + RedirectDataMap* redirect_map) { |
| + bool is_host = key_type == PREFETCH_KEY_TYPE_HOST; |
| + |
| + const char* redirect_table_name = |
| + is_host ? kHostRedirectTableName : kUrlRedirectTableName; |
| + Statement redirect_reader(DB()->GetUniqueStatement( |
| + base::StringPrintf("SELECT * FROM %s", redirect_table_name).c_str())); |
| + |
| + RedirectData data; |
| + std::string primary_key; |
| + while (StepAndInitializeRedirectData(&redirect_reader, &data, &primary_key)) { |
| + auto result = redirect_map->insert(std::make_pair(primary_key, data)); |
| + DCHECK(result.second); |
| + } |
| +} |
| + |
| +bool ResourcePrefetchPredictorTables::UpdateResourceDataHelper( |
| + PrefetchKeyType key_type, |
| const PrefetchData& data) { |
| DCHECK(!data.primary_key.empty()); |
| @@ -262,16 +375,17 @@ bool ResourcePrefetchPredictorTables::UpdateDataHelper( |
| return false; |
| } |
| + bool is_host = key_type == PREFETCH_KEY_TYPE_HOST; |
| + |
| // Delete the older data from both the tables. |
| - std::unique_ptr<Statement> deleter(data.is_host() |
| - ? GetHostResourceDeleteStatement() |
| - : GetUrlResourceDeleteStatement()); |
| + std::unique_ptr<Statement> deleter(is_host ? GetHostResourceDeleteStatement() |
| + : GetUrlResourceDeleteStatement()); |
| deleter->BindString(0, data.primary_key); |
| if (!deleter->Run()) |
| return false; |
| - deleter.reset(data.is_host() ? GetHostMetadataDeleteStatement() : |
| - GetUrlMetadataDeleteStatement()); |
| + deleter.reset(data.is_host() ? GetHostMetadataDeleteStatement() |
| + : GetUrlMetadataDeleteStatement()); |
| deleter->BindString(0, data.primary_key); |
| if (!deleter->Run()) |
| return false; |
| @@ -279,8 +393,8 @@ bool ResourcePrefetchPredictorTables::UpdateDataHelper( |
| // Add the new data to the tables. |
| for (const ResourceData& resource : data.resources) { |
| std::unique_ptr<Statement> resource_inserter( |
| - data.is_host() ? GetHostResourceUpdateStatement() |
| - : GetUrlResourceUpdateStatement()); |
| + is_host ? GetHostResourceUpdateStatement() |
| + : GetUrlResourceUpdateStatement()); |
| BindResourceDataToStatement(resource, data.primary_key, |
| resource_inserter.get()); |
| if (!resource_inserter->Run()) |
| @@ -288,8 +402,8 @@ bool ResourcePrefetchPredictorTables::UpdateDataHelper( |
| } |
| std::unique_ptr<Statement> metadata_inserter( |
| - data.is_host() ? GetHostMetadataUpdateStatement() |
| - : GetUrlMetadataUpdateStatement()); |
| + is_host ? GetHostMetadataUpdateStatement() |
| + : GetUrlMetadataUpdateStatement()); |
| metadata_inserter->BindString(0, data.primary_key); |
| metadata_inserter->BindInt64(1, data.last_visit.ToInternalValue()); |
| if (!metadata_inserter->Run()) |
| @@ -298,7 +412,37 @@ bool ResourcePrefetchPredictorTables::UpdateDataHelper( |
| return true; |
| } |
| -void ResourcePrefetchPredictorTables::DeleteDataHelper( |
| +bool ResourcePrefetchPredictorTables::UpdateRedirectDataHelper( |
| + PrefetchKeyType key_type, |
| + const RedirectData& data) { |
| + DCHECK(data.has_primary_key()); |
| + |
| + if (!StringsAreSmallerThanDBLimit(data)) { |
| + UMA_HISTOGRAM_BOOLEAN("ResourcePrefetchPredictor.DbStringTooLong", true); |
| + return false; |
| + } |
| + |
| + bool is_host = key_type == PREFETCH_KEY_TYPE_HOST; |
| + |
| + // Delete the older data from the table. |
| + std::unique_ptr<Statement> deleter(is_host ? GetHostRedirectDeleteStatement() |
| + : GetUrlRedirectDeleteStatement()); |
| + deleter->BindString(0, data.primary_key()); |
| + if (!deleter->Run()) |
| + return false; |
| + |
| + // Add the new data to the table. |
| + std::unique_ptr<Statement> inserter(is_host |
| + ? GetHostRedirectUpdateStatement() |
| + : GetUrlRedirectUpdateStatement()); |
| + BindRedirectDataToStatement(data, inserter.get()); |
| + if (!inserter->Run()) |
| + return false; |
| + |
| + return true; |
| +} |
| + |
| +void ResourcePrefetchPredictorTables::DeleteResourceDataHelper( |
| PrefetchKeyType key_type, |
| const std::vector<std::string>& keys) { |
| bool is_host = key_type == PREFETCH_KEY_TYPE_HOST; |
| @@ -310,8 +454,22 @@ void ResourcePrefetchPredictorTables::DeleteDataHelper( |
| deleter->BindString(0, key); |
| deleter->Run(); |
| - deleter.reset(is_host ? GetHostMetadataDeleteStatement() : |
| - GetUrlMetadataDeleteStatement()); |
| + deleter.reset(is_host ? GetHostMetadataDeleteStatement() |
| + : GetUrlMetadataDeleteStatement()); |
| + deleter->BindString(0, key); |
| + deleter->Run(); |
| + } |
| +} |
| + |
| +void ResourcePrefetchPredictorTables::DeleteRedirectDataHelper( |
| + PrefetchKeyType key_type, |
| + const std::vector<std::string>& keys) { |
| + bool is_host = key_type == PREFETCH_KEY_TYPE_HOST; |
| + |
| + for (const std::string& key : keys) { |
| + std::unique_ptr<Statement> deleter(is_host |
| + ? GetHostRedirectDeleteStatement() |
| + : GetUrlRedirectDeleteStatement()); |
| deleter->BindString(0, key); |
| deleter->Run(); |
| } |
| @@ -330,8 +488,21 @@ bool ResourcePrefetchPredictorTables::StringsAreSmallerThanDBLimit( |
| return true; |
| } |
| +bool ResourcePrefetchPredictorTables::StringsAreSmallerThanDBLimit( |
| + const RedirectData& data) { |
| + if (data.primary_key().length() > kMaxStringLength) |
| + return false; |
| + |
| + for (const RedirectStat& redirect : data.redirects()) { |
| + if (redirect.url().length() > kMaxStringLength) |
| + return false; |
| + } |
| + return true; |
| +} |
| + |
| // static |
| -float ResourcePrefetchPredictorTables::ComputeScore(const ResourceData& data) { |
| +float ResourcePrefetchPredictorTables::ComputeResourceScore( |
| + const ResourceData& data) { |
| // The score is calculated so that when the rows are sorted, stylesheets, |
| // scripts and fonts appear first, sorted by position(ascending) and then the |
| // rest of the resources sorted by position (ascending). |
| @@ -350,6 +521,13 @@ float ResourcePrefetchPredictorTables::ComputeScore(const ResourceData& data) { |
| } |
| // static |
| +float ResourcePrefetchPredictorTables::ComputeRedirectScore( |
| + const RedirectStat& data) { |
| + // TODO(alexilin): Invent some scoring. |
| + return 0.0; |
| +} |
| + |
| +// static |
| bool ResourcePrefetchPredictorTables::DropTablesIfOutdated( |
| sql::Connection* db) { |
| int version = GetDatabaseVersion(db); |
| @@ -360,7 +538,8 @@ bool ResourcePrefetchPredictorTables::DropTablesIfOutdated( |
| if (incompatible_version) { |
| for (const char* table_name : |
| {kMetadataTableName, kUrlResourceTableName, kHostResourceTableName, |
| - kUrlMetadataTableName, kHostMetadataTableName}) { |
| + kUrlRedirectTableName, kHostRedirectTableName, kUrlMetadataTableName, |
| + kHostMetadataTableName}) { |
| success = |
| success && |
| db->Execute(base::StringPrintf("DROP TABLE IF EXISTS %s", table_name) |
| @@ -427,6 +606,10 @@ void ResourcePrefetchPredictorTables::CreateTableIfNonExistent() { |
| db->Execute(base::StringPrintf(kCreateMetadataTableStatementTemplate, |
| kUrlMetadataTableName) |
| .c_str())) && |
| + (db->DoesTableExist(kUrlRedirectTableName) || |
| + db->Execute(base::StringPrintf(kCreateRedirectTableStatementTemplate, |
| + kUrlRedirectTableName) |
| + .c_str())) && |
| (db->DoesTableExist(kHostResourceTableName) || |
| db->Execute(base::StringPrintf(kCreateResourceTableStatementTemplate, |
| kHostResourceTableName) |
| @@ -434,6 +617,10 @@ void ResourcePrefetchPredictorTables::CreateTableIfNonExistent() { |
| (db->DoesTableExist(kHostMetadataTableName) || |
| db->Execute(base::StringPrintf(kCreateMetadataTableStatementTemplate, |
| kHostMetadataTableName) |
| + .c_str())) && |
| + (db->DoesTableExist(kHostRedirectTableName) || |
| + db->Execute(base::StringPrintf(kCreateRedirectTableStatementTemplate, |
| + kHostRedirectTableName) |
| .c_str())); |
| if (success) |
| @@ -463,6 +650,20 @@ void ResourcePrefetchPredictorTables::LogDatabaseStats() { |
| if (statement.Step()) |
| UMA_HISTOGRAM_COUNTS("ResourcePrefetchPredictor.HostTableRowCount", |
| statement.ColumnInt(0)); |
| + |
| + statement.Assign(DB()->GetUniqueStatement( |
| + base::StringPrintf("SELECT count(*) FROM %s", kUrlRedirectTableName) |
| + .c_str())); |
| + if (statement.Step()) |
| + UMA_HISTOGRAM_COUNTS("ResourcePrefetchPredictor.UrlRedirectTableRowCount", |
| + statement.ColumnInt(0)); |
| + |
| + statement.Assign(DB()->GetUniqueStatement( |
| + base::StringPrintf("SELECT count(*) FROM %s", kHostRedirectTableName) |
| + .c_str())); |
| + if (statement.Step()) |
| + UMA_HISTOGRAM_COUNTS("ResourcePrefetchPredictor.HostRedirectTableRowCount", |
| + statement.ColumnInt(0)); |
| } |
| Statement* |
| @@ -481,22 +682,34 @@ Statement* |
| .c_str())); |
| } |
| -Statement* |
| - ResourcePrefetchPredictorTables::GetUrlMetadataDeleteStatement() { |
| +Statement* ResourcePrefetchPredictorTables::GetUrlMetadataDeleteStatement() { |
| return new Statement(DB()->GetCachedStatement( |
| SQL_FROM_HERE, |
| base::StringPrintf(kDeleteStatementTemplate, kUrlMetadataTableName) |
| .c_str())); |
| } |
| -Statement* |
| - ResourcePrefetchPredictorTables::GetUrlMetadataUpdateStatement() { |
| +Statement* ResourcePrefetchPredictorTables::GetUrlMetadataUpdateStatement() { |
| return new Statement(DB()->GetCachedStatement( |
| SQL_FROM_HERE, base::StringPrintf(kInsertMetadataTableStatementTemplate, |
| kUrlMetadataTableName) |
| .c_str())); |
| } |
| +Statement* ResourcePrefetchPredictorTables::GetUrlRedirectDeleteStatement() { |
| + return new Statement(DB()->GetCachedStatement( |
| + SQL_FROM_HERE, |
| + base::StringPrintf(kDeleteStatementTemplate, kUrlRedirectTableName) |
| + .c_str())); |
| +} |
| + |
| +Statement* ResourcePrefetchPredictorTables::GetUrlRedirectUpdateStatement() { |
| + return new Statement(DB()->GetCachedStatement( |
| + SQL_FROM_HERE, base::StringPrintf(kInsertRedirectTableStatementTemplate, |
| + kUrlRedirectTableName) |
| + .c_str())); |
| +} |
| + |
| Statement* |
| ResourcePrefetchPredictorTables::GetHostResourceDeleteStatement() { |
| return new Statement(DB()->GetCachedStatement( |
| @@ -513,8 +726,7 @@ Statement* |
| .c_str())); |
| } |
| -Statement* |
| - ResourcePrefetchPredictorTables::GetHostMetadataDeleteStatement() { |
| +Statement* ResourcePrefetchPredictorTables::GetHostMetadataDeleteStatement() { |
| return new Statement(DB()->GetCachedStatement( |
| SQL_FROM_HERE, |
| base::StringPrintf(kDeleteStatementTemplate, kHostMetadataTableName) |
| @@ -528,4 +740,18 @@ Statement* ResourcePrefetchPredictorTables::GetHostMetadataUpdateStatement() { |
| .c_str())); |
| } |
| +Statement* ResourcePrefetchPredictorTables::GetHostRedirectDeleteStatement() { |
| + return new Statement(DB()->GetCachedStatement( |
| + SQL_FROM_HERE, |
| + base::StringPrintf(kDeleteStatementTemplate, kHostRedirectTableName) |
| + .c_str())); |
| +} |
| + |
| +Statement* ResourcePrefetchPredictorTables::GetHostRedirectUpdateStatement() { |
| + return new Statement(DB()->GetCachedStatement( |
| + SQL_FROM_HERE, base::StringPrintf(kInsertRedirectTableStatementTemplate, |
| + kHostRedirectTableName) |
| + .c_str())); |
| +} |
| + |
| } // namespace predictors |