11320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// Copyright 2014 The Chromium Authors. All rights reserved. 21320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// Use of this source code is governed by a BSD-style license that can be 31320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// found in the LICENSE file. 41320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 51320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "chrome/browser/predictors/resource_prefetch_predictor_tables.h" 61320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 71320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include <algorithm> 81320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include <utility> 91320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/logging.h" 111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/metrics/histogram.h" 121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/strings/stringprintf.h" 131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "content/public/browser/browser_thread.h" 141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "sql/statement.h" 151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciusing content::BrowserThread; 171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciusing sql::Statement; 181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccinamespace { 201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciconst char kUrlResourceTableName[] = "resource_prefetch_predictor_url"; 221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciconst char kUrlMetadataTableName[] = "resource_prefetch_predictor_url_metadata"; 231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciconst char kHostResourceTableName[] = "resource_prefetch_predictor_host"; 241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciconst char kHostMetadataTableName[] = 251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci "resource_prefetch_predictor_host_metadata"; 261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid BindResourceRowToStatement( 281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const predictors::ResourcePrefetchPredictorTables::ResourceRow& row, 291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const std::string& primary_key, 301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci Statement* statement) { 311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci statement->BindString(0, primary_key); 321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci statement->BindString(1, row.resource_url.spec()); 331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci statement->BindInt(2, static_cast<int>(row.resource_type)); 341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci statement->BindInt(3, row.number_of_hits); 351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci statement->BindInt(4, row.number_of_misses); 361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci statement->BindInt(5, row.consecutive_misses); 371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci statement->BindDouble(6, row.average_position); 381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccibool StepAndInitializeResourceRow( 411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci Statement* statement, 421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci predictors::ResourcePrefetchPredictorTables::ResourceRow* row) { 431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!statement->Step()) 441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return false; 451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci row->primary_key = statement->ColumnString(0); 471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci row->resource_url = GURL(statement->ColumnString(1)); 481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci row->resource_type = static_cast<content::ResourceType>( 491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci statement->ColumnInt(2)); 501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci row->number_of_hits = statement->ColumnInt(3); 511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci row->number_of_misses = statement->ColumnInt(4); 521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci row->consecutive_misses = statement->ColumnInt(5); 531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci row->average_position = statement->ColumnDouble(6); 541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return true; 551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} // namespace 581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccinamespace predictors { 601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// static 621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciconst size_t ResourcePrefetchPredictorTables::kMaxStringLength = 1024; 631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciResourcePrefetchPredictorTables::ResourceRow::ResourceRow() 651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci : resource_type(content::RESOURCE_TYPE_LAST_TYPE), 661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci number_of_hits(0), 671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci number_of_misses(0), 681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci consecutive_misses(0), 691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci average_position(0.0), 701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci score(0.0) { 711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciResourcePrefetchPredictorTables::ResourceRow::ResourceRow( 741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const ResourceRow& other) 751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci : primary_key(other.primary_key), 761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci resource_url(other.resource_url), 771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci resource_type(other.resource_type), 781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci number_of_hits(other.number_of_hits), 791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci number_of_misses(other.number_of_misses), 801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci consecutive_misses(other.consecutive_misses), 811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci average_position(other.average_position), 821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci score(other.score) { 831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciResourcePrefetchPredictorTables::ResourceRow::ResourceRow( 861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const std::string& i_primary_key, 871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const std::string& i_resource_url, 881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci content::ResourceType i_resource_type, 891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci int i_number_of_hits, 901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci int i_number_of_misses, 911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci int i_consecutive_misses, 921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci double i_average_position) 931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci : primary_key(i_primary_key), 941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci resource_url(i_resource_url), 951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci resource_type(i_resource_type), 961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci number_of_hits(i_number_of_hits), 971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci number_of_misses(i_number_of_misses), 981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci consecutive_misses(i_consecutive_misses), 991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci average_position(i_average_position) { 1001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci UpdateScore(); 1011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 1021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid ResourcePrefetchPredictorTables::ResourceRow::UpdateScore() { 1041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // The score is calculated so that when the rows are sorted, the stylesheets 1051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // and scripts appear first, sorted by position(ascending) and then the rest 1061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // of the resources sorted by position(ascending). 1071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci static const int kMaxResourcesPerType = 100; 1081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci switch (resource_type) { 1091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci case content::RESOURCE_TYPE_STYLESHEET: 1101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci case content::RESOURCE_TYPE_SCRIPT: 1111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci score = (2 * kMaxResourcesPerType) - average_position; 1121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci break; 1131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci case content::RESOURCE_TYPE_IMAGE: 1151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci default: 1161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci score = kMaxResourcesPerType - average_position; 1171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci break; 1181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 1191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 1201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccibool ResourcePrefetchPredictorTables::ResourceRow::operator==( 1221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const ResourceRow& rhs) const { 1231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return primary_key == rhs.primary_key && 1241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci resource_url == rhs.resource_url && 1251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci resource_type == rhs.resource_type && 1261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci number_of_hits == rhs.number_of_hits && 1271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci number_of_misses == rhs.number_of_misses && 1281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci consecutive_misses == rhs.consecutive_misses && 1291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci average_position == rhs.average_position && 1301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci score == rhs.score; 1311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 1321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccibool ResourcePrefetchPredictorTables::ResourceRowSorter::operator()( 1341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const ResourceRow& x, const ResourceRow& y) const { 1351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return x.score > y.score; 1361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 1371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciResourcePrefetchPredictorTables::PrefetchData::PrefetchData( 1391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci PrefetchKeyType i_key_type, 1401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const std::string& i_primary_key) 1411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci : key_type(i_key_type), 1421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci primary_key(i_primary_key) { 1431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 1441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciResourcePrefetchPredictorTables::PrefetchData::PrefetchData( 1461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const PrefetchData& other) 1471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci : key_type(other.key_type), 1481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci primary_key(other.primary_key), 1491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci last_visit(other.last_visit), 1501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci resources(other.resources) { 1511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 1521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciResourcePrefetchPredictorTables::PrefetchData::~PrefetchData() { 1541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 1551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccibool ResourcePrefetchPredictorTables::PrefetchData::operator==( 1571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const PrefetchData& rhs) const { 1581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return key_type == rhs.key_type && primary_key == rhs.primary_key && 1591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci resources == rhs.resources; 1601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 1611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid ResourcePrefetchPredictorTables::GetAllData( 1631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci PrefetchDataMap* url_data_map, 1641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci PrefetchDataMap* host_data_map) { 1651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci DCHECK_CURRENTLY_ON(BrowserThread::DB); 1661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (CantAccessDatabase()) 1671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return; 1681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci DCHECK(url_data_map); 1701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci DCHECK(host_data_map); 1711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci url_data_map->clear(); 1721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci host_data_map->clear(); 1731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci std::vector<std::string> urls_to_delete, hosts_to_delete; 1751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci GetAllDataHelper(PREFETCH_KEY_TYPE_URL, url_data_map, &urls_to_delete); 1761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci GetAllDataHelper(PREFETCH_KEY_TYPE_HOST, host_data_map, &hosts_to_delete); 1771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!urls_to_delete.empty() || !hosts_to_delete.empty()) 1791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci DeleteData(urls_to_delete, hosts_to_delete); 1801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 1811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid ResourcePrefetchPredictorTables::UpdateData( 1831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const PrefetchData& url_data, 1841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const PrefetchData& host_data) { 1851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci DCHECK_CURRENTLY_ON(BrowserThread::DB); 1861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (CantAccessDatabase()) 1871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return; 1881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci DCHECK(!url_data.is_host() && host_data.is_host()); 1901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci DCHECK(!url_data.primary_key.empty() || !host_data.primary_key.empty()); 1911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci DB()->BeginTransaction(); 1931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci bool success = (url_data.primary_key.empty() || UpdateDataHelper(url_data)) && 1951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci (host_data.primary_key.empty() || UpdateDataHelper(host_data)); 1961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!success) 1971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci DB()->RollbackTransaction(); 1981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci DB()->CommitTransaction(); 2001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 2011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 2021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid ResourcePrefetchPredictorTables::DeleteData( 2031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const std::vector<std::string>& urls, 2041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const std::vector<std::string>& hosts) { 2051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci DCHECK_CURRENTLY_ON(BrowserThread::DB); 2061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (CantAccessDatabase()) 2071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return; 2081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 2091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci DCHECK(!urls.empty() || !hosts.empty()); 2101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 2111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!urls.empty()) 2121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci DeleteDataHelper(PREFETCH_KEY_TYPE_URL, urls); 2131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!hosts.empty()) 2141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci DeleteDataHelper(PREFETCH_KEY_TYPE_HOST, hosts); 2151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 2161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 2171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid ResourcePrefetchPredictorTables::DeleteSingleDataPoint( 2181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const std::string& key, 2191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci PrefetchKeyType key_type) { 2201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci DCHECK_CURRENTLY_ON(BrowserThread::DB); 2211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (CantAccessDatabase()) 2221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return; 2231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 2241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci DeleteDataHelper(key_type, std::vector<std::string>(1, key)); 2251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 2261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 2271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid ResourcePrefetchPredictorTables::DeleteAllData() { 2281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (CantAccessDatabase()) 2291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return; 2301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 2311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci Statement deleter(DB()->GetUniqueStatement( 2321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci base::StringPrintf("DELETE FROM %s", kUrlResourceTableName).c_str())); 2331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci deleter.Run(); 2341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci deleter.Assign(DB()->GetUniqueStatement( 2351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci base::StringPrintf("DELETE FROM %s", kUrlMetadataTableName).c_str())); 2361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci deleter.Run(); 2371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci deleter.Assign(DB()->GetUniqueStatement( 2381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci base::StringPrintf("DELETE FROM %s", kHostResourceTableName).c_str())); 2391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci deleter.Run(); 2401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci deleter.Assign(DB()->GetUniqueStatement( 2411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci base::StringPrintf("DELETE FROM %s", kHostMetadataTableName).c_str())); 2421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci deleter.Run(); 2431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 2441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 2451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciResourcePrefetchPredictorTables::ResourcePrefetchPredictorTables() 2461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci : PredictorTableBase() { 2471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 2481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 2491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciResourcePrefetchPredictorTables::~ResourcePrefetchPredictorTables() { 2501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 2511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 2521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid ResourcePrefetchPredictorTables::GetAllDataHelper( 2531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci PrefetchKeyType key_type, 2541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci PrefetchDataMap* data_map, 2551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci std::vector<std::string>* to_delete) { 2561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci bool is_host = key_type == PREFETCH_KEY_TYPE_HOST; 2571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 2581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Read the resources table and organize it per primary key. 2591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const char* resource_table_name = is_host ? kHostResourceTableName : 2601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci kUrlResourceTableName; 2611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci Statement resource_reader(DB()->GetUniqueStatement( 2621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci base::StringPrintf("SELECT * FROM %s", resource_table_name).c_str())); 2631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 2641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ResourceRow row; 2651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci while (StepAndInitializeResourceRow(&resource_reader, &row)) { 2661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci row.UpdateScore(); 2671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci std::string primary_key = row.primary_key; 2681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Don't need to store primary key since the data is grouped by primary key. 2691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci row.primary_key.clear(); 2701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 2711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci PrefetchDataMap::iterator it = data_map->find(primary_key); 2721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (it == data_map->end()) { 2731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci it = data_map->insert(std::make_pair( 2741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci primary_key, PrefetchData(key_type, primary_key))).first; 2751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 2761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci it->second.resources.push_back(row); 2771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 2781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 2791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Sort each of the resource row vectors by score. 2801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci for (PrefetchDataMap::iterator it = data_map->begin(); it != data_map->end(); 2811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ++it) { 2821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci std::sort(it->second.resources.begin(), 2831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci it->second.resources.end(), 2841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ResourceRowSorter()); 2851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 2861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 2871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Read the metadata and keep track of entries that have metadata, but no 2881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // resource entries, so they can be deleted. 2891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const char* metadata_table_name = is_host ? kHostMetadataTableName : 2901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci kUrlMetadataTableName; 2911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci Statement metadata_reader(DB()->GetUniqueStatement( 2921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci base::StringPrintf("SELECT * FROM %s", metadata_table_name).c_str())); 2931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 2941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci while (metadata_reader.Step()) { 2951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci std::string primary_key = metadata_reader.ColumnString(0); 2961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 2971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci PrefetchDataMap::iterator it = data_map->find(primary_key); 2981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (it != data_map->end()) { 2991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci int64 last_visit = metadata_reader.ColumnInt64(1); 3001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci it->second.last_visit = base::Time::FromInternalValue(last_visit); 3011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } else { 3021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci to_delete->push_back(primary_key); 3031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 3041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 3051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 3061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 3071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccibool ResourcePrefetchPredictorTables::UpdateDataHelper( 3081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const PrefetchData& data) { 3091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci DCHECK(!data.primary_key.empty()); 3101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 3111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!StringsAreSmallerThanDBLimit(data)) { 3121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci UMA_HISTOGRAM_BOOLEAN("ResourcePrefetchPredictor.DbStringTooLong", true); 3131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return false; 3141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 3151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 3161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Delete the older data from both the tables. 3171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci scoped_ptr<Statement> deleter(data.is_host() ? 3181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci GetHostResourceDeleteStatement() : GetUrlResourceDeleteStatement()); 3191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci deleter->BindString(0, data.primary_key); 3201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!deleter->Run()) 3211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return false; 3221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 3231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci deleter.reset(data.is_host() ? GetHostMetadataDeleteStatement() : 3241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci GetUrlMetadataDeleteStatement()); 3251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci deleter->BindString(0, data.primary_key); 3261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!deleter->Run()) 3271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return false; 3281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 3291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Add the new data to the tables. 3301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const ResourceRows& resources = data.resources; 3311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci for (ResourceRows::const_iterator it = resources.begin(); 3321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci it != resources.end(); ++it) { 3331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci scoped_ptr<Statement> resource_inserter(data.is_host() ? 3341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci GetHostResourceUpdateStatement() : GetUrlResourceUpdateStatement()); 3351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci BindResourceRowToStatement(*it, data.primary_key, resource_inserter.get()); 3361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!resource_inserter->Run()) 3371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return false; 3381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 3391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 3401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci scoped_ptr<Statement> metadata_inserter(data.is_host() ? 3411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci GetHostMetadataUpdateStatement() : GetUrlMetadataUpdateStatement()); 3421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci metadata_inserter->BindString(0, data.primary_key); 3431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci metadata_inserter->BindInt64(1, data.last_visit.ToInternalValue()); 3441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!metadata_inserter->Run()) 3451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return false; 3461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 3471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return true; 3481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 3491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 3501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid ResourcePrefetchPredictorTables::DeleteDataHelper( 3511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci PrefetchKeyType key_type, 3521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const std::vector<std::string>& keys) { 3531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci bool is_host = key_type == PREFETCH_KEY_TYPE_HOST; 3541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 3551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci for (std::vector<std::string>::const_iterator it = keys.begin(); 3561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci it != keys.end(); ++it) { 3571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci scoped_ptr<Statement> deleter(is_host ? GetHostResourceDeleteStatement() : 3581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci GetUrlResourceDeleteStatement()); 3591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci deleter->BindString(0, *it); 3601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci deleter->Run(); 3611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 3621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci deleter.reset(is_host ? GetHostMetadataDeleteStatement() : 3631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci GetUrlMetadataDeleteStatement()); 3641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci deleter->BindString(0, *it); 3651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci deleter->Run(); 3661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 3671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 3681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 3691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccibool ResourcePrefetchPredictorTables::StringsAreSmallerThanDBLimit( 3701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const PrefetchData& data) const { 3711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (data.primary_key.length() > kMaxStringLength) 3721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return false; 3731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 3741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci for (ResourceRows::const_iterator it = data.resources.begin(); 3751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci it != data.resources.end(); ++it) { 3761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (it->resource_url.spec().length() > kMaxStringLength) 3771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return false; 3781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 3791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return true; 3801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 3811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 3821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid ResourcePrefetchPredictorTables::CreateTableIfNonExistent() { 3831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci DCHECK_CURRENTLY_ON(BrowserThread::DB); 3841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (CantAccessDatabase()) 3851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return; 3861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 3871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const char resource_table_creator[] = 3881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci "CREATE TABLE %s ( " 3891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci "main_page_url TEXT, " 3901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci "resource_url TEXT, " 3911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci "resource_type INTEGER, " 3921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci "number_of_hits INTEGER, " 3931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci "number_of_misses INTEGER, " 3941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci "consecutive_misses INTEGER, " 3951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci "average_position DOUBLE, " 3961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci "PRIMARY KEY(main_page_url, resource_url))"; 3971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const char* metadata_table_creator = 3981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci "CREATE TABLE %s ( " 3991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci "main_page_url TEXT, " 4001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci "last_visit_time INTEGER, " 4011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci "PRIMARY KEY(main_page_url))"; 4021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 4031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci sql::Connection* db = DB(); 4041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci bool success = 4051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci (db->DoesTableExist(kUrlResourceTableName) || 4061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci db->Execute(base::StringPrintf(resource_table_creator, 4071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci kUrlResourceTableName).c_str())) && 4081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci (db->DoesTableExist(kUrlMetadataTableName) || 4091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci db->Execute(base::StringPrintf(metadata_table_creator, 4101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci kUrlMetadataTableName).c_str())) && 4111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci (db->DoesTableExist(kHostResourceTableName) || 4121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci db->Execute(base::StringPrintf(resource_table_creator, 4131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci kHostResourceTableName).c_str())) && 4141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci (db->DoesTableExist(kHostMetadataTableName) || 4151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci db->Execute(base::StringPrintf(metadata_table_creator, 4161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci kHostMetadataTableName).c_str())); 4171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 4181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!success) 4191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ResetDB(); 4201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 4211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 4221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid ResourcePrefetchPredictorTables::LogDatabaseStats() { 4231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci DCHECK_CURRENTLY_ON(BrowserThread::DB); 4241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (CantAccessDatabase()) 4251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return; 4261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 4271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci Statement statement(DB()->GetUniqueStatement( 4281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci base::StringPrintf("SELECT count(*) FROM %s", 4291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci kUrlResourceTableName).c_str())); 4301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (statement.Step()) 4311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci UMA_HISTOGRAM_COUNTS("ResourcePrefetchPredictor.UrlTableRowCount", 4321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci statement.ColumnInt(0)); 4331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 4341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci statement.Assign(DB()->GetUniqueStatement( 4351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci base::StringPrintf("SELECT count(*) FROM %s", 4361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci kHostResourceTableName).c_str())); 4371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (statement.Step()) 4381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci UMA_HISTOGRAM_COUNTS("ResourcePrefetchPredictor.HostTableRowCount", 4391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci statement.ColumnInt(0)); 4401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 4411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 4421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciStatement* 4431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ResourcePrefetchPredictorTables::GetUrlResourceDeleteStatement() { 4441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return new Statement(DB()->GetCachedStatement( 4451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci SQL_FROM_HERE, 4461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci base::StringPrintf("DELETE FROM %s WHERE main_page_url=?", 4471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci kUrlResourceTableName).c_str())); 4481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 4491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 4501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciStatement* 4511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ResourcePrefetchPredictorTables::GetUrlResourceUpdateStatement() { 4521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return new Statement(DB()->GetCachedStatement( 4531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci SQL_FROM_HERE, 4541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci base::StringPrintf( 4551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci "INSERT INTO %s " 4561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci "(main_page_url, resource_url, resource_type, number_of_hits, " 4571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci "number_of_misses, consecutive_misses, average_position) " 4581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci "VALUES (?,?,?,?,?,?,?)", kUrlResourceTableName).c_str())); 4591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 4601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 4611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciStatement* 4621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ResourcePrefetchPredictorTables::GetUrlMetadataDeleteStatement() { 4631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return new Statement(DB()->GetCachedStatement( 4641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci SQL_FROM_HERE, 4651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci base::StringPrintf("DELETE FROM %s WHERE main_page_url=?", 4661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci kUrlMetadataTableName).c_str())); 4671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 4681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 4691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciStatement* 4701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ResourcePrefetchPredictorTables::GetUrlMetadataUpdateStatement() { 4711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return new Statement(DB()->GetCachedStatement( 4721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci SQL_FROM_HERE, 4731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci base::StringPrintf( 4741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci "INSERT INTO %s (main_page_url, last_visit_time) VALUES (?,?)", 4751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci kUrlMetadataTableName).c_str())); 4761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 4771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 4781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciStatement* 4791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ResourcePrefetchPredictorTables::GetHostResourceDeleteStatement() { 4801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return new Statement(DB()->GetCachedStatement( 4811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci SQL_FROM_HERE, 4821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci base::StringPrintf("DELETE FROM %s WHERE main_page_url=?", 4831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci kHostResourceTableName).c_str())); 4841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 4851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 4861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciStatement* 4871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ResourcePrefetchPredictorTables::GetHostResourceUpdateStatement() { 4881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return new Statement(DB()->GetCachedStatement( 4891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci SQL_FROM_HERE, 4901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci base::StringPrintf( 4911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci "INSERT INTO %s " 4921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci "(main_page_url, resource_url, resource_type, number_of_hits, " 4931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci "number_of_misses, consecutive_misses, average_position) " 4941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci "VALUES (?,?,?,?,?,?,?)", kHostResourceTableName).c_str())); 4951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 4961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 4971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciStatement* 4981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ResourcePrefetchPredictorTables::GetHostMetadataDeleteStatement() { 4991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return new Statement(DB()->GetCachedStatement( 5001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci SQL_FROM_HERE, 5011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci base::StringPrintf("DELETE FROM %s WHERE main_page_url=?", 5021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci kHostMetadataTableName).c_str())); 5031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 5041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 5051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciStatement* ResourcePrefetchPredictorTables::GetHostMetadataUpdateStatement() { 5061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return new Statement(DB()->GetCachedStatement( 5071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci SQL_FROM_HERE, 5081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci base::StringPrintf( 5091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci "INSERT INTO %s (main_page_url, last_visit_time) VALUES (?,?)", 5101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci kHostMetadataTableName).c_str())); 5111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 5121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 5131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} // namespace predictors 514