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