158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved.
258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// found in the LICENSE file.
458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "components/precache/core/precache_url_table.h"
658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include <string>
858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "base/logging.h"
1058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "sql/connection.h"
1158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "sql/statement.h"
124e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
131e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)using sql::Statement;
14cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
15cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)namespace {
164e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
17d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)// Returns the spec of the given URL.
184e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)std::string GetKey(const GURL& url) {
1958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  return url.spec();
201e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)}
2158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
224e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}  // namespace
234e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
244e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)namespace precache {
256e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
2658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)PrecacheURLTable::PrecacheURLTable() : db_(NULL) {}
274e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
284e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)PrecacheURLTable::~PrecacheURLTable() {}
2958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
3058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)bool PrecacheURLTable::Init(sql::Connection* db) {
314e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  DCHECK(!db_);  // Init must only be called once.
324e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  DCHECK(db);    // The database connection must be non-NULL.
336e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  db_ = db;
344e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  return CreateTableIfNonExistent();
3558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
36d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
37d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)void PrecacheURLTable::AddURL(const GURL& url,
38d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)                              const base::Time& precache_time) {
39d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  Statement statement(db_->GetCachedStatement(
4058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      SQL_FROM_HERE,
414e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      "INSERT OR REPLACE INTO precache_urls (url, time) VALUES(?,?)"));
424e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
434e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  statement.BindString(0, GetKey(url));
444e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  statement.BindInt64(1, precache_time.ToInternalValue());
45cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  statement.Run();
46cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
47cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
484e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)bool PrecacheURLTable::HasURL(const GURL& url) {
494e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  Statement statement(db_->GetCachedStatement(
5058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      SQL_FROM_HERE, "SELECT time FROM precache_urls WHERE url=?"));
5158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
5258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  statement.BindString(0, GetKey(url));
5358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  return statement.Step();
5458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
5558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
5658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)void PrecacheURLTable::DeleteURL(const GURL& url) {
5758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  Statement statement(db_->GetCachedStatement(
58d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      SQL_FROM_HERE, "DELETE FROM precache_urls WHERE url=?"));
59d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
6058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  statement.BindString(0, GetKey(url));
61d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  statement.Run();
62d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)}
63d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
64d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)void PrecacheURLTable::DeleteAllPrecachedBefore(const base::Time& delete_end) {
6558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  Statement statement(db_->GetCachedStatement(
6658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      SQL_FROM_HERE, "DELETE FROM precache_urls WHERE time < ?"));
6758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
6858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  statement.BindInt64(0, delete_end.ToInternalValue());
69d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  statement.Run();
7058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
710f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
720f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)void PrecacheURLTable::GetAllDataForTesting(std::map<GURL, base::Time>* map) {
7358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  map->clear();
7458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
7558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  Statement statement(db_->GetCachedStatement(
7658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      SQL_FROM_HERE, "SELECT url, time FROM precache_urls"));
7758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
7858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  while (statement.Step()) {
7958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    GURL url = GURL(statement.ColumnString(0));
800f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    (*map)[url] = base::Time::FromInternalValue(statement.ColumnInt64(1));
8158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  }
8258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
8358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
8458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)bool PrecacheURLTable::CreateTableIfNonExistent() {
85d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  return db_->Execute(
86d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      "CREATE TABLE IF NOT EXISTS precache_urls (url TEXT PRIMARY KEY, time "
87d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      "INTEGER)");
88d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)}
89d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
90d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)}  // namespace precache
91d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)