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)