Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(5413)

Unified Diff: chrome/browser/history/thumbnail_database.cc

Issue 10802066: Adds support for saving favicon size into history database. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 8 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: chrome/browser/history/thumbnail_database.cc
diff --git a/chrome/browser/history/thumbnail_database.cc b/chrome/browser/history/thumbnail_database.cc
index d9462ada00ae4b5b1ce8bef8a5a18c56d1f07aeb..6ce585a72d7ebb90f0380d7e698197ad2ed9d6f5 100644
--- a/chrome/browser/history/thumbnail_database.cc
+++ b/chrome/browser/history/thumbnail_database.cc
@@ -10,6 +10,8 @@
#include "base/command_line.h"
#include "base/file_util.h"
#include "base/memory/ref_counted_memory.h"
+#include "base/string_number_conversions.h"
+#include "base/string_tokenizer.h"
#include "base/string_util.h"
#include "base/time.h"
#include "base/utf_string_conversions.h"
@@ -71,8 +73,6 @@
// width Pixel width of |image_data|.
// height Pixel height of |image_data|.
-
-
static void FillIconMapping(const sql::Statement& statement,
const GURL& page_url,
history::IconMapping* icon_mapping) {
@@ -80,6 +80,7 @@ static void FillIconMapping(const sql::Statement& statement,
icon_mapping->icon_id = statement.ColumnInt64(1);
icon_mapping->icon_type =
static_cast<history::IconType>(statement.ColumnInt(2));
+ icon_mapping->icon_url = GURL(statement.ColumnString(3));
icon_mapping->page_url = page_url;
}
@@ -103,7 +104,7 @@ bool ThumbnailDatabase::IconMappingEnumerator::GetNextIconMapping(
IconMapping* icon_mapping) {
if (!statement_.Step())
return false;
- FillIconMapping(statement_, GURL(statement_.ColumnString(3)), icon_mapping);
+ FillIconMapping(statement_, GURL(statement_.ColumnString(4)), icon_mapping);
return true;
}
@@ -447,6 +448,26 @@ bool ThumbnailDatabase::ThumbnailScoreForId(URLID id,
return true;
}
+bool ThumbnailDatabase::GetFaviconBitmapIDSizeList(
+ FaviconID icon_id,
+ std::vector<FaviconBitmapIDSize>* bitmap_id_size_list) {
+ DCHECK(icon_id);
+ sql::Statement statement(db_.GetCachedStatement(SQL_FROM_HERE,
+ "SELECT id, width, height FROM favicon_bitmaps WHERE icon_id=?"));
+ statement.BindInt64(0, icon_id);
+
+ bool result = false;
+ while (statement.Step()) {
+ result = true;
+ FaviconBitmapIDSize bitmap_id_size;
+ bitmap_id_size.bitmap_id = statement.ColumnInt(0);
+ bitmap_id_size.pixel_size = gfx::Size(statement.ColumnInt(1),
+ statement.ColumnInt(2));
+ bitmap_id_size_list->push_back(bitmap_id_size);
+ }
+ return result;
+}
+
bool ThumbnailDatabase::GetFaviconBitmaps(
FaviconID icon_id,
std::vector<FaviconBitmap>* favicon_bitmaps) {
@@ -479,6 +500,36 @@ bool ThumbnailDatabase::GetFaviconBitmaps(
return result;
}
+bool ThumbnailDatabase::GetFaviconBitmap(
+ FaviconBitmapID bitmap_id,
+ base::Time* last_updated,
+ scoped_refptr<base::RefCountedMemory>* png_icon_data,
+ gfx::Size* pixel_size) {
+ DCHECK(bitmap_id);
+ sql::Statement statement(db_.GetCachedStatement(SQL_FROM_HERE,
+ "SELECT last_updated, image_data, width, height FROM favicon_bitmaps "
+ "WHERE id=?"));
+ statement.BindInt64(0, bitmap_id);
+
+ if (!statement.Step())
+ return false;
+
+ if (last_updated)
+ *last_updated = base::Time::FromTimeT(statement.ColumnInt64(0));
+
+ if (png_icon_data && statement.ColumnByteLength(1) > 0) {
+ scoped_refptr<base::RefCountedBytes> data(new base::RefCountedBytes());
+ statement.ColumnBlobAsVector(2, &data->data());
+ *png_icon_data = data;
+ }
+
+ if (pixel_size) {
+ *pixel_size = gfx::Size(statement.ColumnInt(2),
+ statement.ColumnInt(3));
+ }
+ return true;
+}
+
FaviconBitmapID ThumbnailDatabase::AddFaviconBitmap(
FaviconID icon_id,
const scoped_refptr<base::RefCountedMemory>& icon_data,
@@ -504,18 +555,40 @@ FaviconBitmapID ThumbnailDatabase::AddFaviconBitmap(
return db_.GetLastInsertRowId();
}
-bool ThumbnailDatabase::DeleteFaviconBitmapsForFavicon(FaviconID icon_id) {
+bool ThumbnailDatabase::SetFaviconBitmap(
+ FaviconBitmapID bitmap_id,
+ scoped_refptr<base::RefCountedMemory> icon_data,
+ base::Time time) {
+ DCHECK(bitmap_id);
+ sql::Statement statement(db_.GetCachedStatement(SQL_FROM_HERE,
+ "UPDATE favicon_bitmaps SET image_data=?, last_updated=? WHERE id=?"));
+ if (icon_data.get() && icon_data->size()) {
+ statement.BindBlob(0, icon_data->front(),
+ static_cast<int>(icon_data->size()));
+ } else {
+ statement.BindNull(0);
+ }
+ statement.BindInt64(1, time.ToTimeT());
+ statement.BindInt64(2, bitmap_id);
+
+ return statement.Run();
+}
+
+bool ThumbnailDatabase::DeleteFaviconBitmap(FaviconBitmapID bitmap_id) {
sql::Statement statement(db_.GetCachedStatement(SQL_FROM_HERE,
- "DELETE FROM favicon_bitmaps WHERE icon_id=?"));
- statement.BindInt64(0, icon_id);
+ "DELETE FROM favicon_bitmaps WHERE id=?"));
+ statement.BindInt64(0, bitmap_id);
return statement.Run();
}
bool ThumbnailDatabase::SetFaviconSizes(FaviconID icon_id,
- const std::string& sizes) {
+ const std::vector<gfx::Size>& sizes) {
+ std::string sizes_as_string;
+ FaviconSizesToDatabaseString(sizes, &sizes_as_string);
+
sql::Statement statement(db_.GetCachedStatement(SQL_FROM_HERE,
"UPDATE favicons SET sizes=? WHERE id=?"));
- statement.BindString(0, sizes);
+ statement.BindString(0, sizes_as_string);
statement.BindInt64(1, icon_id);
return statement.Run();
@@ -531,50 +604,23 @@ bool ThumbnailDatabase::SetFaviconOutOfDate(FaviconID icon_id) {
}
FaviconID ThumbnailDatabase::GetFaviconIDForFaviconURL(const GURL& icon_url,
- int required_icon_type,
- IconType* icon_type) {
+ int required_icon_type) {
sql::Statement statement(db_.GetCachedStatement(SQL_FROM_HERE,
- "SELECT id, icon_type FROM favicons WHERE url=? AND (icon_type & ? > 0) "
+ "SELECT id FROM favicons WHERE url=? AND (icon_type & ? > 0) "
"ORDER BY icon_type DESC"));
statement.BindString(0, URLDatabase::GURLToDatabaseURL(icon_url));
statement.BindInt(1, required_icon_type);
if (!statement.Step())
return 0; // not cached
-
- if (icon_type)
- *icon_type = static_cast<IconType>(statement.ColumnInt(1));
return statement.ColumnInt64(0);
}
-bool ThumbnailDatabase::GetFavicon(
- FaviconID icon_id,
- base::Time* last_updated,
- scoped_refptr<base::RefCountedMemory>* png_icon_data,
- GURL* icon_url,
- IconType* icon_type) {
- DCHECK(icon_id);
-
- std::vector<FaviconBitmap> favicon_bitmaps;
- if (!GetFaviconBitmaps(icon_id, &favicon_bitmaps))
- return false;
-
- if (favicon_bitmaps.empty())
- return false;
-
- if (last_updated)
- *last_updated = favicon_bitmaps[0].last_updated;
-
- *png_icon_data = favicon_bitmaps[0].bitmap_data;
-
- return GetFaviconHeader(icon_id, icon_url, icon_type, NULL);
-}
-
bool ThumbnailDatabase::GetFaviconHeader(
FaviconID icon_id,
GURL* icon_url,
IconType* icon_type,
- std::string* sizes) {
+ std::vector<gfx::Size>* sizes) {
DCHECK(icon_id);
sql::Statement statement(db_.GetCachedStatement(SQL_FROM_HERE,
@@ -588,8 +634,10 @@ bool ThumbnailDatabase::GetFaviconHeader(
*icon_url = GURL(statement.ColumnString(0));
if (icon_type)
*icon_type = static_cast<history::IconType>(statement.ColumnInt(1));
- if (sizes)
- *sizes = statement.ColumnString(2);
+ if (sizes) {
+ if (!DatabaseStringToFaviconSizes(statement.ColumnString(2), sizes))
+ return false;
+ }
return true;
}
@@ -610,7 +658,7 @@ FaviconID ThumbnailDatabase::AddFavicon(const GURL& icon_url,
FaviconID ThumbnailDatabase::AddFavicon(
const GURL& icon_url,
IconType icon_type,
- const std::string& sizes,
+ const std::vector<gfx::Size>& sizes,
const scoped_refptr<base::RefCountedMemory>& icon_data,
base::Time time,
const gfx::Size& pixel_size) {
@@ -637,30 +685,33 @@ bool ThumbnailDatabase::DeleteFavicon(FaviconID id) {
return statement.Run();
}
-bool ThumbnailDatabase::GetIconMappingForPageURL(const GURL& page_url,
- IconType required_icon_type,
- IconMapping* icon_mapping) {
- std::vector<IconMapping> icon_mappings;
- if (!GetIconMappingsForPageURL(page_url, &icon_mappings))
+bool ThumbnailDatabase::GetIconMappingsForPageURL(
+ const GURL& page_url,
+ int required_icon_types,
+ std::vector<IconMapping>* filtered_mapping_data) {
+ std::vector<IconMapping> mapping_data;
+ if (!GetIconMappingsForPageURL(page_url, &mapping_data))
return false;
- for (std::vector<IconMapping>::iterator m = icon_mappings.begin();
- m != icon_mappings.end(); ++m) {
- if (m->icon_type == required_icon_type) {
- if (icon_mapping != NULL)
- *icon_mapping = *m;
- return true;
+ bool result = false;
+ for (std::vector<IconMapping>::iterator m = mapping_data.begin();
+ m != mapping_data.end(); ++m) {
+ if (m->icon_type & required_icon_types) {
+ result = true;
+ if (filtered_mapping_data == NULL)
+ return result;
+ filtered_mapping_data->push_back(*m);
}
}
-
- return false;
+ return result;
}
bool ThumbnailDatabase::GetIconMappingsForPageURL(
const GURL& page_url,
std::vector<IconMapping>* mapping_data) {
sql::Statement statement(db_.GetCachedStatement(SQL_FROM_HERE,
- "SELECT icon_mapping.id, icon_mapping.icon_id, favicons.icon_type "
+ "SELECT icon_mapping.id, icon_mapping.icon_id, favicons.icon_type, "
+ "favicons.url "
"FROM icon_mapping "
"INNER JOIN favicons "
"ON icon_mapping.icon_id = favicons.id "
@@ -704,6 +755,14 @@ bool ThumbnailDatabase::DeleteIconMappings(const GURL& page_url) {
return statement.Run();
}
+bool ThumbnailDatabase::DeleteIconMapping(IconMappingID mapping_id) {
+ sql::Statement statement(db_.GetCachedStatement(SQL_FROM_HERE,
+ "DELETE FROM icon_mapping WHERE id=?"));
+ statement.BindInt64(0, mapping_id);
+
+ return statement.Run();
+}
+
bool ThumbnailDatabase::HasMappingFor(FaviconID id) {
sql::Statement statement(db_.GetCachedStatement(SQL_FROM_HERE,
"SELECT id FROM icon_mapping "
@@ -713,8 +772,8 @@ bool ThumbnailDatabase::HasMappingFor(FaviconID id) {
return statement.Step();
}
-bool ThumbnailDatabase::CloneIconMapping(const GURL& old_page_url,
- const GURL& new_page_url) {
+bool ThumbnailDatabase::CloneIconMappings(const GURL& old_page_url,
+ const GURL& new_page_url) {
sql::Statement statement(db_.GetCachedStatement(SQL_FROM_HERE,
"SELECT icon_id FROM icon_mapping "
"WHERE page_url=?"));
@@ -743,7 +802,7 @@ bool ThumbnailDatabase::InitIconMappingEnumerator(
enumerator->statement_.Assign(db_.GetCachedStatement(
SQL_FROM_HERE,
"SELECT icon_mapping.id, icon_mapping.icon_id, favicons.icon_type, "
- "icon_mapping.page_url "
+ "favicons.url, icon_mapping.page_url "
"FROM icon_mapping JOIN favicons ON ("
"icon_mapping.icon_id = favicons.id) "
"WHERE favicons.icon_type = ?"));
@@ -1017,4 +1076,41 @@ bool ThumbnailDatabase::UpgradeToVersion6() {
return true;
}
+// static
+void ThumbnailDatabase::FaviconSizesToDatabaseString(
+ const FaviconSizes& sizes,
+ std::string* sizes_string) {
+ std::vector<std::string> parts;
+ for (std::vector<gfx::Size>::const_iterator it = sizes.begin();
+ it != sizes.end(); ++it) {
+ parts.push_back(base::IntToString(it->width()));
+ parts.push_back(base::IntToString(it->height()));
+ }
+ *sizes_string = JoinString(parts, ' ');
+}
+
+// static
+bool ThumbnailDatabase::DatabaseStringToFaviconSizes(
+ const std::string sizes_string,
+ FaviconSizes* sizes) {
+ bool no_errors = true;
+
+ StringTokenizer t(sizes_string, " ");
+ while (t.GetNext() && no_errors) {
+ int width, height = 0;
+ no_errors &= base::StringToInt(t.token(), &width);
+ if (!t.GetNext()) {
+ no_errors = false;
+ break;
+ }
+ no_errors &= base::StringToInt(t.token(), &height);
+ sizes->push_back(gfx::Size(width, height));
+ }
+
+ if (!no_errors)
+ sizes->clear();
+
+ return no_errors;
+}
+
} // namespace history

Powered by Google App Engine
This is Rietveld 408576698