blob: c9f4dc885acf09c7806ffdcc12d628b8bc691355 [file] [log] [blame]
// Copyright (c) 2012 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef CHROME_BROWSER_HISTORY_THUMBNAIL_DATABASE_H_
#define CHROME_BROWSER_HISTORY_THUMBNAIL_DATABASE_H_
#include <vector>
#include "base/gtest_prod_util.h"
#include "base/memory/ref_counted.h"
#include "chrome/browser/history/history_types.h"
#include "sql/connection.h"
#include "sql/init_status.h"
#include "sql/meta_table.h"
#include "sql/statement.h"
class FilePath;
struct ThumbnailScore;
class SkBitmap;
namespace base {
class RefCountedMemory;
class Time;
}
namespace gfx {
class Image;
}
namespace history {
class ExpireHistoryBackend;
class HistoryPublisher;
// This database interface is owned by the history backend and runs on the
// history thread. It is a totally separate component from history partially
// because we may want to move it to its own thread in the future. The
// operations we will do on this database will be slow, but we can tolerate
// higher latency (it's OK for thumbnails to come in slower than the rest
// of the data). Moving this to a separate thread would not block potentially
// higher priority history operations.
class ThumbnailDatabase {
public:
ThumbnailDatabase();
~ThumbnailDatabase();
// Must be called after creation but before any other methods are called.
// When not INIT_OK, no other functions should be called.
sql::InitStatus Init(const FilePath& db_name,
const HistoryPublisher* history_publisher,
URLDatabase* url_database);
// Open database on a given filename. If the file does not exist,
// it is created.
// |db| is the database to open.
// |db_name| is a path to the database file.
static sql::InitStatus OpenDatabase(sql::Connection* db,
const FilePath& db_name);
// Transactions on the database.
void BeginTransaction();
void CommitTransaction();
int transaction_nesting() const {
return db_.transaction_nesting();
}
void RollbackTransaction();
// Vacuums the database. This will cause sqlite to defragment and collect
// unused space in the file. It can be VERY SLOW.
void Vacuum();
// Thumbnails ----------------------------------------------------------------
// Sets the given data to be the thumbnail for the given URL,
// overwriting any previous data. If the SkBitmap contains no pixel
// data, the thumbnail will be deleted.
bool SetPageThumbnail(const GURL& url,
URLID id,
const gfx::Image* thumbnail,
const ThumbnailScore& score,
base::Time time);
// Retrieves thumbnail data for the given URL, returning true on success,
// false if there is no such thumbnail or there was some other error.
bool GetPageThumbnail(URLID id, std::vector<unsigned char>* data);
// Delete the thumbnail with the provided id. Returns false on failure
bool DeleteThumbnail(URLID id);
// If there is a thumbnail score for the id provided, retrieves the
// current thumbnail score and places it in |score| and returns
// true. Returns false otherwise.
bool ThumbnailScoreForId(URLID id, ThumbnailScore* score);
// Called by the to delete all old thumbnails and make a clean table.
// Returns true on success.
bool RecreateThumbnailTable();
// Favicon Bitmaps -----------------------------------------------------------
// Returns true if there are favicon bitmaps for |icon_id|. If
// |bitmap_id_sizes| is non NULL, sets it to a list of the favicon bitmap ids
// and their associated pixel sizes for the favicon with |icon_id|.
// The list contains results for the bitmaps which are cached in the
// favicon_bitmaps table. The pixel sizes are a subset of the sizes in the
// 'sizes' field of the favicons table for |icon_id|.
bool GetFaviconBitmapIDSizes(
FaviconID icon_id,
std::vector<FaviconBitmapIDSize>* bitmap_id_sizes);
// Returns true if there are any matched bitmaps for the given |icon_id|. All
// matched results are returned if |favicon_bitmaps| is not NULL.
bool GetFaviconBitmaps(FaviconID icon_id,
std::vector<FaviconBitmap>* favicon_bitmaps);
// Gets the last updated time, bitmap data, and pixel size of the favicon
// bitmap at |bitmap_id|. Returns true if successful.
bool GetFaviconBitmap(FaviconBitmapID bitmap_id,
base::Time* last_updated,
scoped_refptr<base::RefCountedMemory>* png_icon_data,
gfx::Size* pixel_size);
// Adds a bitmap component at |pixel_size| for the favicon with |icon_id|.
// Only favicons representing a .ico file should have multiple favicon bitmaps
// per favicon.
// |icon_data| is the png encoded data.
// The |time| indicates the access time, and is used to detect when the
// favicon should be refreshed.
// |pixel_size| is the pixel dimensions of |icon_data|.
// Returns the id of the added bitmap or 0 if unsuccessful.
FaviconBitmapID AddFaviconBitmap(
FaviconID icon_id,
const scoped_refptr<base::RefCountedMemory>& icon_data,
base::Time time,
const gfx::Size& pixel_size);
// Sets the bitmap data and the last updated time for the favicon bitmap at
// |bitmap_id|.
// Returns true if successful.
bool SetFaviconBitmap(FaviconBitmapID bitmap_id,
scoped_refptr<base::RefCountedMemory> bitmap_data,
base::Time time);
// Deletes the favicon bitmaps for the favicon with with |icon_id|.
// Returns true if successful.
bool DeleteFaviconBitmapsForFavicon(FaviconID icon_id);
// Deletes the favicon bitmap with |bitmap_id|.
// Returns true if successful.
bool DeleteFaviconBitmap(FaviconBitmapID bitmap_id);
// Favicons ------------------------------------------------------------------
// Updates the favicon sizes associated with a favicon to |favicon_sizes|.
// See comment in history_types.h for description of |favicon_sizes|.
bool SetFaviconSizes(FaviconID icon_id, const FaviconSizes& favicon_sizes);
// Sets the the favicon as out of date. This will set |last_updated| for all
// of the bitmaps for |icon_id| to be out of date.
bool SetFaviconOutOfDate(FaviconID icon_id);
// Returns the id of the entry in the favicon database with the specified url
// and icon type. If |required_icon_type| contains multiple icon types and
// there are more than one matched icon in database, only one icon will be
// returned in the priority of TOUCH_PRECOMPOSED_ICON, TOUCH_ICON, and
// FAVICON, and the icon type is returned in icon_type parameter if it is not
// NULL.
// Returns 0 if no entry exists for the specified url.
FaviconID GetFaviconIDForFaviconURL(const GURL& icon_url,
int required_icon_type,
IconType* icon_type);
// Gets the icon_url, icon_type and sizes for the specified |icon_id|.
bool GetFaviconHeader(FaviconID icon_id,
GURL* icon_url,
IconType* icon_type,
FaviconSizes* favicon_sizes);
// Adds favicon with |icon_url|, |icon_type| and |favicon_sizes| to the
// favicon db, returning its id.
FaviconID AddFavicon(const GURL& icon_url,
IconType icon_type,
const FaviconSizes& favicon_sizes);
// Adds a favicon with a single bitmap. This call is equivalent to calling
// AddFavicon and AddFaviconBitmap.
FaviconID AddFavicon(const GURL& icon_url,
IconType icon_type,
const FaviconSizes& favicon_sizes,
const scoped_refptr<base::RefCountedMemory>& icon_data,
base::Time time,
const gfx::Size& pixel_size);
// Delete the favicon with the provided id. Returns false on failure
bool DeleteFavicon(FaviconID id);
// Icon Mapping --------------------------------------------------------------
//
// Returns true if there is a matched icon mapping for the given page and
// icon type.
// The matched icon mapping is returned in the icon_mapping parameter if it is
// not NULL.
// Returns true if there are icon mappings for the given page and icon types.
// If |required_icon_types| contains multiple icon types and there is more
// than one matched icon type in the database, icons of only a single type
// will be returned in the priority of TOUCH_PRECOMPOSED_ICON, TOUCH_ICON,
// and FAVICON.
// The matched icon mappings are returned in the |mapping_data| parameter if
// it is not NULL.
bool GetIconMappingsForPageURL(const GURL& page_url,
int required_icon_types,
std::vector<IconMapping>* mapping_data);
// Returns true if there is any matched icon mapping for the given page.
// All matched icon mappings are returned in descent order of IconType if
// mapping_data is not NULL.
bool GetIconMappingsForPageURL(const GURL& page_url,
std::vector<IconMapping>* mapping_data);
// Adds a mapping between the given page_url and icon_id.
// Returns the new mapping id if the adding succeeds, otherwise 0 is returned.
IconMappingID AddIconMapping(const GURL& page_url, FaviconID icon_id);
// Updates the page and icon mapping for the given mapping_id with the given
// icon_id.
// Returns true if the update succeeded.
bool UpdateIconMapping(IconMappingID mapping_id, FaviconID icon_id);
// Deletes the icon mapping entries for the given page url.
// Returns true if the deletion succeeded.
bool DeleteIconMappings(const GURL& page_url);
// Deletes the icon mapping with |mapping_id|.
// Returns true if the deletion succeeded.
bool DeleteIconMapping(IconMappingID mapping_id);
// Checks whether a favicon is used by any URLs in the database.
bool HasMappingFor(FaviconID id);
// Clones the existing mappings from |old_page_url| if |new_page_url| has no
// mappings. Otherwise, will leave mappings alone.
bool CloneIconMappings(const GURL& old_page_url, const GURL& new_page_url);
// The class to enumerate icon mappings. Use InitIconMappingEnumerator to
// initialize.
class IconMappingEnumerator {
public:
IconMappingEnumerator();
~IconMappingEnumerator();
// Get the next icon mapping, return false if no more are available.
bool GetNextIconMapping(IconMapping* icon_mapping);
private:
friend class ThumbnailDatabase;
// Used to query database and return the data for filling IconMapping in
// each call of GetNextIconMapping().
sql::Statement statement_;
DISALLOW_COPY_AND_ASSIGN(IconMappingEnumerator);
};
// Return all icon mappings of the given |icon_type|.
bool InitIconMappingEnumerator(IconType type,
IconMappingEnumerator* enumerator);
// Temporary Tables ---------------------------------------------------------
//
// Creates empty temporary tables for each of the tables in the thumbnail
// database. Favicon data which is not copied into the temporary tables will
// be deleted when CommitTemporaryTables() is called. This is used to delete
// most of the favicons when clearing history.
bool InitTemporaryTables();
// Replaces the main tables in the thumbnail database with the temporary
// tables created with InitTemporaryTables(). This means that any data not
// copied over will be deleted.
bool CommitTemporaryTables();
// Copies the given icon mapping from the "main" icon_mapping table to the
// temporary one. This is only valid in between calls to
// InitTemporaryTables() and CommitTemporaryTables().
//
// The ID of the favicon will change when this copy takes place. The new ID
// is returned, or 0 on failure.
IconMappingID AddToTemporaryIconMappingTable(const GURL& page_url,
const FaviconID icon_id);
// Copies the given favicon and associated favicon bitmaps from the "main"
// favicon and favicon_bitmaps tables to the temporary ones. This is only
// valid in between calls to InitTemporaryTables() and
// CommitTemporaryTables().
//
// The ID of the favicon will change when this copy takes place. The new ID
// is returned, or 0 on failure.
FaviconID CopyFaviconAndFaviconBitmapsToTemporaryTables(FaviconID source);
// Returns true iff the thumbnails table exists.
// Migrating to TopSites is dropping the thumbnails table.
bool NeedsMigrationToTopSites();
// Renames the database file and drops the Thumbnails table.
bool RenameAndDropThumbnails(const FilePath& old_db_file,
const FilePath& new_db_file);
private:
friend class ExpireHistoryBackend;
FRIEND_TEST_ALL_PREFIXES(ThumbnailDatabaseTest,
GetFaviconAfterMigrationToTopSites);
FRIEND_TEST_ALL_PREFIXES(ThumbnailDatabaseTest, UpgradeToVersion4);
FRIEND_TEST_ALL_PREFIXES(ThumbnailDatabaseTest, UpgradeToVersion5);
FRIEND_TEST_ALL_PREFIXES(ThumbnailDatabaseTest, UpgradeToVersion6);
FRIEND_TEST_ALL_PREFIXES(ThumbnailDatabaseTest, FaviconSizesToAndFromString);
FRIEND_TEST_ALL_PREFIXES(HistoryBackendTest, MigrationIconMapping);
// Creates the thumbnail table, returning true if the table already exists
// or was successfully created.
bool InitThumbnailTable();
// Helper function to handle cleanup on upgrade failures.
sql::InitStatus CantUpgradeToVersion(int cur_version);
// Adds support for the new metadata on web page thumbnails.
bool UpgradeToVersion3();
// Adds support for the icon_type in favicon table.
bool UpgradeToVersion4();
// Adds support for sizes in favicon table.
bool UpgradeToVersion5();
// Adds support for size in favicons table and removes sizes column.
bool UpgradeToVersion6();
// Migrates the icon mapping data from URL database to Thumbnail database.
// Return whether the migration succeeds.
bool MigrateIconMappingData(URLDatabase* url_db);
// Creates the favicon table, returning true if the table already exists,
// or was successfully created. |is_temporary| will be false when generating
// the "regular" favicons table. The expirer sets this to true to generate the
// temporary table, which will have a different name but the same schema.
// |db| is the connection to use for initializing the table.
// A different connection is used in RenameAndDropThumbnails, when we
// need to copy the favicons between two database files.
bool InitFaviconsTable(sql::Connection* db, bool is_temporary);
// Creates the index over the favicon table. This will be called during
// initialization after the table is created. This is a separate function
// because it is used by SwapFaviconTables to create an index over the
// newly-renamed favicons table (formerly the temporary table with no index).
bool InitFaviconsIndex();
// Creates the favicon_bitmaps table, return true if the table already exists
// or was successfully created.
bool InitFaviconBitmapsTable(sql::Connection* db, bool is_temporary);
// Creates the index over the favicon_bitmaps table. This will be called
// during initialization after the table is created. This is a separate
// function because it is used by CommitTemporaryTables to create an
// index over the newly-renamed favicon_bitmaps table (formerly the temporary
// table with no index).
bool InitFaviconBitmapsIndex();
// Creates the icon_map table, return true if the table already exists or was
// successfully created.
bool InitIconMappingTable(sql::Connection* db, bool is_temporary);
// Creates the index over the icon_mapping table, This will be called during
// initialization after the table is created. This is a separate function
// because it is used by CommitTemporaryIconMappingTable to create an index
// over the newly-renamed icon_mapping table (formerly the temporary table
// with no index).
bool InitIconMappingIndex();
// Adds a mapping between the given page_url and icon_id; The mapping will be
// added to temp_icon_mapping table if is_temporary is true.
// Returns the new mapping id if the adding succeeds, otherwise 0 is returned.
IconMappingID AddIconMapping(const GURL& page_url,
FaviconID icon_id,
bool is_temporary);
// Returns True if the current database is latest.
bool IsLatestVersion();
// Converts the vector representation of favicon sizes as passed into
// SetFaviconSizes to a string to store in the |favicons| database table.
// Format:
// Each widthxheight pair is separated by a space.
// Width and height are separated by a space.
// For instance, if sizes contains pixel sizes (16x16, 32x32), the
// string representation is "16 16 32 32".
static void FaviconSizesToDatabaseString(const FaviconSizes& favicon_sizes,
std::string* favicon_sizes_string);
// Converts the string representation of favicon sizes as stored in the
// |favicons| database table to a vector. Returns an empty vector if there
// were parsing errors.
static void DatabaseStringToFaviconSizes(
const std::string& favicon_sizes_string,
FaviconSizes* favicon_sizes);
sql::Connection db_;
sql::MetaTable meta_table_;
// This object is created and managed by the history backend. We maintain an
// opaque pointer to the object for our use.
// This can be NULL if there are no indexers registered to receive indexing
// data from us.
const HistoryPublisher* history_publisher_;
// True if migration to TopSites has been done and the thumbnails
// table should not be used.
bool use_top_sites_;
};
} // namespace history
#endif // CHROME_BROWSER_HISTORY_THUMBNAIL_DATABASE_H_