1// Copyright 2013 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "components/precache/core/precache_url_table.h"
6
7#include <string>
8
9#include "base/logging.h"
10#include "sql/connection.h"
11#include "sql/statement.h"
12
13using sql::Statement;
14
15namespace {
16
17// Returns the spec of the given URL.
18std::string GetKey(const GURL& url) {
19  return url.spec();
20}
21
22}  // namespace
23
24namespace precache {
25
26PrecacheURLTable::PrecacheURLTable() : db_(NULL) {}
27
28PrecacheURLTable::~PrecacheURLTable() {}
29
30bool PrecacheURLTable::Init(sql::Connection* db) {
31  DCHECK(!db_);  // Init must only be called once.
32  DCHECK(db);    // The database connection must be non-NULL.
33  db_ = db;
34  return CreateTableIfNonExistent();
35}
36
37void PrecacheURLTable::AddURL(const GURL& url,
38                              const base::Time& precache_time) {
39  Statement statement(db_->GetCachedStatement(
40      SQL_FROM_HERE,
41      "INSERT OR REPLACE INTO precache_urls (url, time) VALUES(?,?)"));
42
43  statement.BindString(0, GetKey(url));
44  statement.BindInt64(1, precache_time.ToInternalValue());
45  statement.Run();
46}
47
48bool PrecacheURLTable::HasURL(const GURL& url) {
49  Statement statement(db_->GetCachedStatement(
50      SQL_FROM_HERE, "SELECT time FROM precache_urls WHERE url=?"));
51
52  statement.BindString(0, GetKey(url));
53  return statement.Step();
54}
55
56void PrecacheURLTable::DeleteURL(const GURL& url) {
57  Statement statement(db_->GetCachedStatement(
58      SQL_FROM_HERE, "DELETE FROM precache_urls WHERE url=?"));
59
60  statement.BindString(0, GetKey(url));
61  statement.Run();
62}
63
64void PrecacheURLTable::DeleteAllPrecachedBefore(const base::Time& delete_end) {
65  Statement statement(db_->GetCachedStatement(
66      SQL_FROM_HERE, "DELETE FROM precache_urls WHERE time < ?"));
67
68  statement.BindInt64(0, delete_end.ToInternalValue());
69  statement.Run();
70}
71
72void PrecacheURLTable::GetAllDataForTesting(std::map<GURL, base::Time>* map) {
73  map->clear();
74
75  Statement statement(db_->GetCachedStatement(
76      SQL_FROM_HERE, "SELECT url, time FROM precache_urls"));
77
78  while (statement.Step()) {
79    GURL url = GURL(statement.ColumnString(0));
80    (*map)[url] = base::Time::FromInternalValue(statement.ColumnInt64(1));
81  }
82}
83
84bool PrecacheURLTable::CreateTableIfNonExistent() {
85  return db_->Execute(
86      "CREATE TABLE IF NOT EXISTS precache_urls (url TEXT PRIMARY KEY, time "
87      "INTEGER)");
88}
89
90}  // namespace precache
91