1ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved.
2c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Use of this source code is governed by a BSD-style license that can be
3c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// found in the LICENSE file.
4c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
5c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#ifndef CHROME_BROWSER_HISTORY_THUMBNAIL_DATABASE_H_
6c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#define CHROME_BROWSER_HISTORY_THUMBNAIL_DATABASE_H_
73345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#pragma once
8c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
9c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include <vector>
10c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
11c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "app/sql/connection.h"
12c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "app/sql/init_status.h"
13c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "app/sql/meta_table.h"
14ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "base/gtest_prod_util.h"
15ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "base/memory/ref_counted.h"
16ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "base/memory/scoped_ptr.h"
17c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/history/history_types.h"
18c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
19c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass FilePath;
20c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass RefCountedMemory;
21c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochstruct ThumbnailScore;
22c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass SkBitmap;
23c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
24c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochnamespace base {
25c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass Time;
26c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
27c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
28c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochnamespace history {
29c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
30c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass ExpireHistoryBackend;
31c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass HistoryPublisher;
32c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
33c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// This database interface is owned by the history backend and runs on the
34c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// history thread. It is a totally separate component from history partially
35c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// because we may want to move it to its own thread in the future. The
36c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// operations we will do on this database will be slow, but we can tolerate
37c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// higher latency (it's OK for thumbnails to come in slower than the rest
38c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// of the data). Moving this to a separate thread would not block potentially
39c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// higher priority history operations.
40c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass ThumbnailDatabase {
41c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public:
42c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ThumbnailDatabase();
43c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ~ThumbnailDatabase();
44c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
45c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Must be called after creation but before any other methods are called.
46c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // When not INIT_OK, no other functions should be called.
47c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  sql::InitStatus Init(const FilePath& db_name,
48ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                       const HistoryPublisher* history_publisher,
49ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                       URLDatabase* url_database);
50c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
51c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Open database on a given filename. If the file does not exist,
52c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // it is created.
53c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // |db| is the database to open.
54c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // |db_name| is a path to the database file.
55c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  static sql::InitStatus OpenDatabase(sql::Connection* db,
56c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                      const FilePath& db_name);
57c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
58c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Transactions on the database.
59c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void BeginTransaction();
60c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void CommitTransaction();
61c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  int transaction_nesting() const {
62c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return db_.transaction_nesting();
63c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
64c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
65c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Vacuums the database. This will cause sqlite to defragment and collect
66c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // unused space in the file. It can be VERY SLOW.
67c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void Vacuum();
68c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
69c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Thumbnails ----------------------------------------------------------------
70c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
71c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Sets the given data to be the thumbnail for the given URL,
72c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // overwriting any previous data. If the SkBitmap contains no pixel
73c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // data, the thumbnail will be deleted.
74c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void SetPageThumbnail(const GURL& url,
75c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                        URLID id,
76c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                        const SkBitmap& thumbnail,
77c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                        const ThumbnailScore& score,
78c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                        base::Time time);
79c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
80c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Retrieves thumbnail data for the given URL, returning true on success,
81c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // false if there is no such thumbnail or there was some other error.
82c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  bool GetPageThumbnail(URLID id, std::vector<unsigned char>* data);
83c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
84c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Delete the thumbnail with the provided id. Returns false on failure
85c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  bool DeleteThumbnail(URLID id);
86c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
87c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // If there is a thumbnail score for the id provided, retrieves the
88c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // current thumbnail score and places it in |score| and returns
89c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // true. Returns false otherwise.
90c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  bool ThumbnailScoreForId(URLID id, ThumbnailScore* score);
91c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
92c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Called by the to delete all old thumbnails and make a clean table.
93c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Returns true on success.
94c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  bool RecreateThumbnailTable();
95c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
96ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // Favicons ------------------------------------------------------------------
97c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
98c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Sets the bits for a favicon. This should be png encoded data.
99c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // The time indicates the access time, and is used to detect when the favicon
100c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // should be refreshed.
101ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  bool SetFavicon(FaviconID icon_id,
102c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                  scoped_refptr<RefCountedMemory> icon_data,
103c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                  base::Time time);
104c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
105c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Sets the time the favicon was last updated.
106ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  bool SetFaviconLastUpdateTime(FaviconID icon_id, base::Time time);
107ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
108ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // Returns the id of the entry in the favicon database with the specified url
109ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // and icon type. If |required_icon_type| contains multiple icon types and
110ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // there are more than one matched icon in database, only one icon will be
111ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // returned in the priority of TOUCH_PRECOMPOSED_ICON, TOUCH_ICON, and
112ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // FAVICON, and the icon type is returned in icon_type parameter if it is not
113ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // NULL.
114c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Returns 0 if no entry exists for the specified url.
115ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  FaviconID GetFaviconIDForFaviconURL(const GURL& icon_url,
116ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                      int required_icon_type,
117ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                      IconType* icon_type);
118c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
119c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Gets the png encoded favicon and last updated time for the specified
120c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // favicon id.
121ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  bool GetFavicon(FaviconID icon_id,
122c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                  base::Time* last_updated,
123c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                  std::vector<unsigned char>* png_icon_data,
124c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                  GURL* icon_url);
125c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
126ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // Adds the favicon URL and icon type to the favicon db, returning its id.
127ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  FaviconID AddFavicon(const GURL& icon_url, IconType icon_type);
128c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
129c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Delete the favicon with the provided id. Returns false on failure
130ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  bool DeleteFavicon(FaviconID id);
131ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
132ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // Icon Mapping --------------------------------------------------------------
133ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  //
134ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // Returns true if there is a matched icon mapping for the given page and
135ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // icon type.
136ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // The matched icon mapping is returned in the icon_mapping parameter if it is
137ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // not NULL.
138ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  bool GetIconMappingForPageURL(const GURL& page_url,
139ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                IconType required_icon_type,
140ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                IconMapping* icon_mapping);
141ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
142ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // Returns true if there is any matched icon mapping for the given page.
143ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // All matched icon mappings are returned in descent order of IconType if
144ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // mapping_data is not NULL.
145ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  bool GetIconMappingsForPageURL(const GURL& page_url,
146ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                 std::vector<IconMapping>* mapping_data);
147ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
148ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // Adds a mapping between the given page_url and icon_id.
149ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // Returns the new mapping id if the adding succeeds, otherwise 0 is returned.
150ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  IconMappingID AddIconMapping(const GURL& page_url, FaviconID icon_id);
151ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
152ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // Updates the page and icon mapping for the given mapping_id with the given
153ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // icon_id.
154ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // Returns true if the update succeeded.
155ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  bool UpdateIconMapping(IconMappingID mapping_id, FaviconID icon_id);
156ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
157ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // Deletes the icon mapping entries for the given page url.
158ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // Returns true if the deletion succeeded.
159ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  bool DeleteIconMappings(const GURL& page_url);
160ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
161ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // Checks whether a favicon is used by any URLs in the database.
162ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  bool HasMappingFor(FaviconID id);
163ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
164ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // Temporary IconMapping -----------------------------------------------------
165ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  //
166ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // Creates a temporary table to store icon mapping. Icon mapping will be
167ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // copied to this table by AddToTemporaryIconMappingTable() and then the
168ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // original table will be dropped, leaving only those copied mapping
169ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // remaining. This is used to quickly delete most of the icon mapping when
170ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // clearing history.
171ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  bool InitTemporaryIconMappingTable() {
172ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    return InitIconMappingTable(&db_, true);
173ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  }
174c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
175ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // Copies the given icon mapping from the "main" icon_mapping table to the
176ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // temporary one. This is only valid in between calls to
177ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // InitTemporaryIconMappingTable()
178ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // and CommitTemporaryIconMappingTable().
179ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  //
180ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // The ID of the favicon will change when this copy takes place. The new ID
181ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // is returned, or 0 on failure.
182ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  IconMappingID AddToTemporaryIconMappingTable(const GURL& page_url,
183ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                               const FaviconID icon_id);
184ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
185ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // Replaces the main icon mapping table with the temporary table created by
186ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // InitTemporaryIconMappingTable(). This will mean all icon mapping not copied
187ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // over will be deleted. Returns true on success.
188ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  bool CommitTemporaryIconMappingTable();
189ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
190ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // Temporary Favicons --------------------------------------------------------
191c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
192c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Create a temporary table to store favicons. Favicons will be copied to
193ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // this table by CopyToTemporaryFaviconTable() and then the original table
194c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // will be dropped, leaving only those copied favicons remaining. This is
195c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // used to quickly delete most of the favicons when clearing history.
196ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  bool InitTemporaryFaviconsTable() {
197ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    return InitFaviconsTable(&db_, true);
198c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
199c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
200c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Copies the given favicon from the "main" favicon table to the temporary
201ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // one. This is only valid in between calls to InitTemporaryFaviconsTable()
202ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // and CommitTemporaryFaviconTable().
203c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  //
204c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // The ID of the favicon will change when this copy takes place. The new ID
205c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // is returned, or 0 on failure.
206ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  FaviconID CopyToTemporaryFaviconTable(FaviconID source);
207c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
208c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Replaces the main URL table with the temporary table created by
209ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // InitTemporaryFaviconsTable(). This will mean all favicons not copied over
210c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // will be deleted. Returns true on success.
211ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  bool CommitTemporaryFaviconTable();
212c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
213c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Returns true iff the thumbnails table exists.
214c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Migrating to TopSites is dropping the thumbnails table.
215c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  bool NeedsMigrationToTopSites();
216c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
217c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Renames the database file and drops the Thumbnails table.
218c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  bool RenameAndDropThumbnails(const FilePath& old_db_file,
219c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                               const FilePath& new_db_file);
220c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
221c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch private:
222c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  friend class ExpireHistoryBackend;
223ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  FRIEND_TEST_ALL_PREFIXES(ThumbnailDatabaseTest, UpgradeToVersion4);
224ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  FRIEND_TEST_ALL_PREFIXES(HistoryBackendTest, MigrationIconMapping);
225c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
226c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Creates the thumbnail table, returning true if the table already exists
227c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // or was successfully created.
228c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  bool InitThumbnailTable();
229c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
230c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Creates the favicon table, returning true if the table already exists,
231c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // or was successfully created. |is_temporary| will be false when generating
232c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // the "regular" favicons table. The expirer sets this to true to generate the
233c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // temporary table, which will have a different name but the same schema.
234c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // |db| is the connection to use for initializing the table.
235c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // A different connection is used in RenameAndDropThumbnails, when we
236c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // need to copy the favicons between two database files.
237ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  bool InitFaviconsTable(sql::Connection* db, bool is_temporary);
238c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
239c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Adds support for the new metadata on web page thumbnails.
240c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  bool UpgradeToVersion3();
241c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
242ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // Adds support for the icon_type in favicon table.
243ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  bool UpgradeToVersion4();
244ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
245ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // Migrates the icon mapping data from URL database to Thumbnail database.
246ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // Return whether the migration succeeds.
247ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  bool MigrateIconMappingData(URLDatabase* url_db);
248ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
249c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Creates the index over the favicon table. This will be called during
250c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // initialization after the table is created. This is a separate function
251c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // because it is used by SwapFaviconTables to create an index over the
252c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // newly-renamed favicons table (formerly the temporary table with no index).
253ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  void InitFaviconsIndex();
254ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
255ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // Creates the icon_map table, return true if the table already exists or was
256ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // successfully created.
257ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  bool InitIconMappingTable(sql::Connection* db, bool is_temporary);
258ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
259ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // Creates the index over the icon_mapping table, This will be called during
260ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // initialization after the table is created. This is a separate function
261ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // because it is used by CommitTemporaryIconMappingTable to create an index
262ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // over the newly-renamed icon_mapping table (formerly the temporary table
263ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // with no index).
264ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  void InitIconMappingIndex();
265ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
266ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // Adds a mapping between the given page_url and icon_id; The mapping will be
267ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // added to temp_icon_mapping table if is_temporary is true.
268ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // Returns the new mapping id if the adding succeeds, otherwise 0 is returned.
269ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  IconMappingID AddIconMapping(const GURL& page_url,
270ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                               FaviconID icon_id,
271ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                               bool is_temporary);
272c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
273c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  sql::Connection db_;
274c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  sql::MetaTable meta_table_;
275c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
276c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // This object is created and managed by the history backend. We maintain an
277c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // opaque pointer to the object for our use.
278c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // This can be NULL if there are no indexers registered to receive indexing
279c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // data from us.
280c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  const HistoryPublisher* history_publisher_;
281c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
282c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // True if migration to TopSites has been done and the thumbnails
283c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // table should not be used.
284c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  bool use_top_sites_;
285c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
286c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
287c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}  // namespace history
288c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
289c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#endif  // CHROME_BROWSER_HISTORY_THUMBNAIL_DATABASE_H_
290