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

Side by Side 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: Changes as requested Created 8 years, 3 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 unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "chrome/browser/history/thumbnail_database.h" 5 #include "chrome/browser/history/thumbnail_database.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 #include <string> 8 #include <string>
9 9
10 #include "base/command_line.h" 10 #include "base/command_line.h"
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after
73 // width Pixel width of |image_data|. 73 // width Pixel width of |image_data|.
74 // height Pixel height of |image_data|. 74 // height Pixel height of |image_data|.
75 75
76 static void FillIconMapping(const sql::Statement& statement, 76 static void FillIconMapping(const sql::Statement& statement,
77 const GURL& page_url, 77 const GURL& page_url,
78 history::IconMapping* icon_mapping) { 78 history::IconMapping* icon_mapping) {
79 icon_mapping->mapping_id = statement.ColumnInt64(0); 79 icon_mapping->mapping_id = statement.ColumnInt64(0);
80 icon_mapping->icon_id = statement.ColumnInt64(1); 80 icon_mapping->icon_id = statement.ColumnInt64(1);
81 icon_mapping->icon_type = 81 icon_mapping->icon_type =
82 static_cast<history::IconType>(statement.ColumnInt(2)); 82 static_cast<history::IconType>(statement.ColumnInt(2));
83 icon_mapping->icon_url = GURL(statement.ColumnString(3));
83 icon_mapping->page_url = page_url; 84 icon_mapping->page_url = page_url;
84 } 85 }
85 86
86 namespace history { 87 namespace history {
87 88
88 // Version number of the database. 89 // Version number of the database.
89 static const int kCurrentVersionNumber = 6; 90 static const int kCurrentVersionNumber = 6;
90 static const int kCompatibleVersionNumber = 6; 91 static const int kCompatibleVersionNumber = 6;
91 92
92 // Use 90 quality (out of 100) which is pretty high, because we're very 93 // Use 90 quality (out of 100) which is pretty high, because we're very
93 // sensitive to artifacts for these small sized, highly detailed images. 94 // sensitive to artifacts for these small sized, highly detailed images.
94 static const int kImageQuality = 90; 95 static const int kImageQuality = 90;
95 96
96 ThumbnailDatabase::IconMappingEnumerator::IconMappingEnumerator() { 97 ThumbnailDatabase::IconMappingEnumerator::IconMappingEnumerator() {
97 } 98 }
98 99
99 ThumbnailDatabase::IconMappingEnumerator::~IconMappingEnumerator() { 100 ThumbnailDatabase::IconMappingEnumerator::~IconMappingEnumerator() {
100 } 101 }
101 102
102 bool ThumbnailDatabase::IconMappingEnumerator::GetNextIconMapping( 103 bool ThumbnailDatabase::IconMappingEnumerator::GetNextIconMapping(
103 IconMapping* icon_mapping) { 104 IconMapping* icon_mapping) {
104 if (!statement_.Step()) 105 if (!statement_.Step())
105 return false; 106 return false;
106 FillIconMapping(statement_, GURL(statement_.ColumnString(3)), icon_mapping); 107 FillIconMapping(statement_, GURL(statement_.ColumnString(4)), icon_mapping);
107 return true; 108 return true;
108 } 109 }
109 110
110 ThumbnailDatabase::ThumbnailDatabase() 111 ThumbnailDatabase::ThumbnailDatabase()
111 : history_publisher_(NULL), 112 : history_publisher_(NULL),
112 use_top_sites_(false) { 113 use_top_sites_(false) {
113 } 114 }
114 115
115 sql::InitStatus ThumbnailDatabase::CantUpgradeToVersion(int cur_version) { 116 sql::InitStatus ThumbnailDatabase::CantUpgradeToVersion(int cur_version) {
116 LOG(WARNING) << "Unable to update to thumbnail database to version " << 117 LOG(WARNING) << "Unable to update to thumbnail database to version " <<
(...skipping 323 matching lines...) Expand 10 before | Expand all | Expand 10 after
440 double current_boring_score = select_statement.ColumnDouble(0); 441 double current_boring_score = select_statement.ColumnDouble(0);
441 bool current_clipping = select_statement.ColumnBool(1); 442 bool current_clipping = select_statement.ColumnBool(1);
442 bool current_at_top = select_statement.ColumnBool(2); 443 bool current_at_top = select_statement.ColumnBool(2);
443 base::Time last_updated = 444 base::Time last_updated =
444 base::Time::FromTimeT(select_statement.ColumnInt64(3)); 445 base::Time::FromTimeT(select_statement.ColumnInt64(3));
445 *score = ThumbnailScore(current_boring_score, current_clipping, 446 *score = ThumbnailScore(current_boring_score, current_clipping,
446 current_at_top, last_updated); 447 current_at_top, last_updated);
447 return true; 448 return true;
448 } 449 }
449 450
451 bool ThumbnailDatabase::GetFaviconBitmapIDSizes(
452 FaviconID icon_id,
453 std::vector<FaviconBitmapIDSize>* bitmap_id_sizes) {
454 DCHECK(icon_id);
455 sql::Statement statement(db_.GetCachedStatement(SQL_FROM_HERE,
456 "SELECT id, width, height FROM favicon_bitmaps WHERE icon_id=?"));
457 statement.BindInt64(0, icon_id);
458
459 bool result = false;
460 while (statement.Step()) {
461 result = true;
462 if (!bitmap_id_sizes)
463 return result;
464
465 FaviconBitmapIDSize bitmap_id_size;
466 bitmap_id_size.bitmap_id = statement.ColumnInt(0);
467 bitmap_id_size.pixel_size = gfx::Size(statement.ColumnInt(1),
468 statement.ColumnInt(2));
469 bitmap_id_sizes->push_back(bitmap_id_size);
470 }
471 return result;
472 }
473
450 bool ThumbnailDatabase::GetFaviconBitmaps( 474 bool ThumbnailDatabase::GetFaviconBitmaps(
451 FaviconID icon_id, 475 FaviconID icon_id,
452 std::vector<FaviconBitmap>* favicon_bitmaps) { 476 std::vector<FaviconBitmap>* favicon_bitmaps) {
453 DCHECK(icon_id); 477 DCHECK(icon_id);
454 sql::Statement statement(db_.GetCachedStatement(SQL_FROM_HERE, 478 sql::Statement statement(db_.GetCachedStatement(SQL_FROM_HERE,
455 "SELECT id, last_updated, image_data, width, height FROM favicon_bitmaps " 479 "SELECT id, last_updated, image_data, width, height FROM favicon_bitmaps "
456 "WHERE icon_id=?")); 480 "WHERE icon_id=?"));
457 statement.BindInt64(0, icon_id); 481 statement.BindInt64(0, icon_id);
458 482
459 bool result = false; 483 bool result = false;
(...skipping 12 matching lines...) Expand all
472 statement.ColumnBlobAsVector(2, &data->data()); 496 statement.ColumnBlobAsVector(2, &data->data());
473 favicon_bitmap.bitmap_data = data; 497 favicon_bitmap.bitmap_data = data;
474 } 498 }
475 favicon_bitmap.pixel_size = gfx::Size(statement.ColumnInt(3), 499 favicon_bitmap.pixel_size = gfx::Size(statement.ColumnInt(3),
476 statement.ColumnInt(4)); 500 statement.ColumnInt(4));
477 favicon_bitmaps->push_back(favicon_bitmap); 501 favicon_bitmaps->push_back(favicon_bitmap);
478 } 502 }
479 return result; 503 return result;
480 } 504 }
481 505
506 bool ThumbnailDatabase::GetFaviconBitmap(
507 FaviconBitmapID bitmap_id,
508 base::Time* last_updated,
509 scoped_refptr<base::RefCountedMemory>* png_icon_data,
510 gfx::Size* pixel_size) {
511 DCHECK(bitmap_id);
512 sql::Statement statement(db_.GetCachedStatement(SQL_FROM_HERE,
513 "SELECT last_updated, image_data, width, height FROM favicon_bitmaps "
514 "WHERE id=?"));
515 statement.BindInt64(0, bitmap_id);
516
517 if (!statement.Step())
518 return false;
519
520 if (last_updated)
521 *last_updated = base::Time::FromTimeT(statement.ColumnInt64(0));
522
523 if (png_icon_data && statement.ColumnByteLength(1) > 0) {
524 scoped_refptr<base::RefCountedBytes> data(new base::RefCountedBytes());
525 statement.ColumnBlobAsVector(1, &data->data());
526 *png_icon_data = data;
527 }
528
529 if (pixel_size) {
530 *pixel_size = gfx::Size(statement.ColumnInt(2),
531 statement.ColumnInt(3));
532 }
533 return true;
534 }
535
482 FaviconBitmapID ThumbnailDatabase::AddFaviconBitmap( 536 FaviconBitmapID ThumbnailDatabase::AddFaviconBitmap(
483 FaviconID icon_id, 537 FaviconID icon_id,
484 const scoped_refptr<base::RefCountedMemory>& icon_data, 538 const scoped_refptr<base::RefCountedMemory>& icon_data,
485 base::Time time, 539 base::Time time,
486 const gfx::Size& pixel_size) { 540 const gfx::Size& pixel_size) {
487 DCHECK(icon_id); 541 DCHECK(icon_id);
488 sql::Statement statement(db_.GetCachedStatement(SQL_FROM_HERE, 542 sql::Statement statement(db_.GetCachedStatement(SQL_FROM_HERE,
489 "INSERT INTO favicon_bitmaps (icon_id, image_data, last_updated, width, " 543 "INSERT INTO favicon_bitmaps (icon_id, image_data, last_updated, width, "
490 "height) VALUES (?, ?, ?, ?, ?)")); 544 "height) VALUES (?, ?, ?, ?, ?)"));
491 statement.BindInt64(0, icon_id); 545 statement.BindInt64(0, icon_id);
492 if (icon_data.get() && icon_data->size()) { 546 if (icon_data.get() && icon_data->size()) {
493 statement.BindBlob(1, icon_data->front(), 547 statement.BindBlob(1, icon_data->front(),
494 static_cast<int>(icon_data->size())); 548 static_cast<int>(icon_data->size()));
495 } else { 549 } else {
496 statement.BindNull(1); 550 statement.BindNull(1);
497 } 551 }
498 statement.BindInt64(2, time.ToTimeT()); 552 statement.BindInt64(2, time.ToTimeT());
499 statement.BindInt(3, pixel_size.width()); 553 statement.BindInt(3, pixel_size.width());
500 statement.BindInt(4, pixel_size.height()); 554 statement.BindInt(4, pixel_size.height());
501 555
502 if (!statement.Run()) 556 if (!statement.Run())
503 return 0; 557 return 0;
504 return db_.GetLastInsertRowId(); 558 return db_.GetLastInsertRowId();
505 } 559 }
506 560
507 bool ThumbnailDatabase::DeleteFaviconBitmapsForFavicon(FaviconID icon_id) { 561 bool ThumbnailDatabase::SetFaviconBitmap(
562 FaviconBitmapID bitmap_id,
563 scoped_refptr<base::RefCountedMemory> bitmap_data,
564 base::Time time) {
565 DCHECK(bitmap_id);
508 sql::Statement statement(db_.GetCachedStatement(SQL_FROM_HERE, 566 sql::Statement statement(db_.GetCachedStatement(SQL_FROM_HERE,
509 "DELETE FROM favicon_bitmaps WHERE icon_id=?")); 567 "UPDATE favicon_bitmaps SET image_data=?, last_updated=? WHERE id=?"));
510 statement.BindInt64(0, icon_id); 568 if (bitmap_data.get() && bitmap_data->size()) {
569 statement.BindBlob(0, bitmap_data->front(),
570 static_cast<int>(bitmap_data->size()));
571 } else {
572 statement.BindNull(0);
573 }
574 statement.BindInt64(1, time.ToTimeT());
575 statement.BindInt64(2, bitmap_id);
576
511 return statement.Run(); 577 return statement.Run();
512 } 578 }
513 579
580 bool ThumbnailDatabase::DeleteFaviconBitmap(FaviconBitmapID bitmap_id) {
581 sql::Statement statement(db_.GetCachedStatement(SQL_FROM_HERE,
582 "DELETE FROM favicon_bitmaps WHERE id=?"));
583 statement.BindInt64(0, bitmap_id);
584 return statement.Run();
585 }
586
514 bool ThumbnailDatabase::SetFaviconSizes(FaviconID icon_id, 587 bool ThumbnailDatabase::SetFaviconSizes(FaviconID icon_id,
515 const FaviconSizes& favicon_sizes) { 588 const FaviconSizes& favicon_sizes) {
516 std::string favicon_sizes_as_string; 589 std::string favicon_sizes_as_string;
517 FaviconSizesToDatabaseString(favicon_sizes, &favicon_sizes_as_string); 590 FaviconSizesToDatabaseString(favicon_sizes, &favicon_sizes_as_string);
518 591
519 sql::Statement statement(db_.GetCachedStatement(SQL_FROM_HERE, 592 sql::Statement statement(db_.GetCachedStatement(SQL_FROM_HERE,
520 "UPDATE favicons SET sizes=? WHERE id=?")); 593 "UPDATE favicons SET sizes=? WHERE id=?"));
521 statement.BindString(0, favicon_sizes_as_string); 594 statement.BindString(0, favicon_sizes_as_string);
522 statement.BindInt64(1, icon_id); 595 statement.BindInt64(1, icon_id);
523 596
(...skipping 119 matching lines...) Expand 10 before | Expand all | Expand 10 after
643 filtered_mapping_data->push_back(*m); 716 filtered_mapping_data->push_back(*m);
644 } 717 }
645 } 718 }
646 return result; 719 return result;
647 } 720 }
648 721
649 bool ThumbnailDatabase::GetIconMappingsForPageURL( 722 bool ThumbnailDatabase::GetIconMappingsForPageURL(
650 const GURL& page_url, 723 const GURL& page_url,
651 std::vector<IconMapping>* mapping_data) { 724 std::vector<IconMapping>* mapping_data) {
652 sql::Statement statement(db_.GetCachedStatement(SQL_FROM_HERE, 725 sql::Statement statement(db_.GetCachedStatement(SQL_FROM_HERE,
653 "SELECT icon_mapping.id, icon_mapping.icon_id, favicons.icon_type " 726 "SELECT icon_mapping.id, icon_mapping.icon_id, favicons.icon_type, "
727 "favicons.url "
654 "FROM icon_mapping " 728 "FROM icon_mapping "
655 "INNER JOIN favicons " 729 "INNER JOIN favicons "
656 "ON icon_mapping.icon_id = favicons.id " 730 "ON icon_mapping.icon_id = favicons.id "
657 "WHERE icon_mapping.page_url=? " 731 "WHERE icon_mapping.page_url=? "
658 "ORDER BY favicons.icon_type DESC")); 732 "ORDER BY favicons.icon_type DESC"));
659 statement.BindString(0, URLDatabase::GURLToDatabaseURL(page_url)); 733 statement.BindString(0, URLDatabase::GURLToDatabaseURL(page_url));
660 734
661 bool result = false; 735 bool result = false;
662 while (statement.Step()) { 736 while (statement.Step()) {
663 result = true; 737 result = true;
(...skipping 23 matching lines...) Expand all
687 } 761 }
688 762
689 bool ThumbnailDatabase::DeleteIconMappings(const GURL& page_url) { 763 bool ThumbnailDatabase::DeleteIconMappings(const GURL& page_url) {
690 sql::Statement statement(db_.GetCachedStatement(SQL_FROM_HERE, 764 sql::Statement statement(db_.GetCachedStatement(SQL_FROM_HERE,
691 "DELETE FROM icon_mapping WHERE page_url = ?")); 765 "DELETE FROM icon_mapping WHERE page_url = ?"));
692 statement.BindString(0, URLDatabase::GURLToDatabaseURL(page_url)); 766 statement.BindString(0, URLDatabase::GURLToDatabaseURL(page_url));
693 767
694 return statement.Run(); 768 return statement.Run();
695 } 769 }
696 770
771 bool ThumbnailDatabase::DeleteIconMapping(IconMappingID mapping_id) {
772 sql::Statement statement(db_.GetCachedStatement(SQL_FROM_HERE,
773 "DELETE FROM icon_mapping WHERE id=?"));
774 statement.BindInt64(0, mapping_id);
775
776 return statement.Run();
777 }
778
697 bool ThumbnailDatabase::HasMappingFor(FaviconID id) { 779 bool ThumbnailDatabase::HasMappingFor(FaviconID id) {
698 sql::Statement statement(db_.GetCachedStatement(SQL_FROM_HERE, 780 sql::Statement statement(db_.GetCachedStatement(SQL_FROM_HERE,
699 "SELECT id FROM icon_mapping " 781 "SELECT id FROM icon_mapping "
700 "WHERE icon_id=?")); 782 "WHERE icon_id=?"));
701 statement.BindInt64(0, id); 783 statement.BindInt64(0, id);
702 784
703 return statement.Step(); 785 return statement.Step();
704 } 786 }
705 787
706 bool ThumbnailDatabase::CloneIconMappings(const GURL& old_page_url, 788 bool ThumbnailDatabase::CloneIconMappings(const GURL& old_page_url,
(...skipping 19 matching lines...) Expand all
726 return statement.Run(); 808 return statement.Run();
727 } 809 }
728 810
729 bool ThumbnailDatabase::InitIconMappingEnumerator( 811 bool ThumbnailDatabase::InitIconMappingEnumerator(
730 IconType type, 812 IconType type,
731 IconMappingEnumerator* enumerator) { 813 IconMappingEnumerator* enumerator) {
732 DCHECK(!enumerator->statement_.is_valid()); 814 DCHECK(!enumerator->statement_.is_valid());
733 enumerator->statement_.Assign(db_.GetCachedStatement( 815 enumerator->statement_.Assign(db_.GetCachedStatement(
734 SQL_FROM_HERE, 816 SQL_FROM_HERE,
735 "SELECT icon_mapping.id, icon_mapping.icon_id, favicons.icon_type, " 817 "SELECT icon_mapping.id, icon_mapping.icon_id, favicons.icon_type, "
736 "icon_mapping.page_url " 818 "favicons.url, icon_mapping.page_url "
737 "FROM icon_mapping JOIN favicons ON (" 819 "FROM icon_mapping JOIN favicons ON ("
738 "icon_mapping.icon_id = favicons.id) " 820 "icon_mapping.icon_id = favicons.id) "
739 "WHERE favicons.icon_type = ?")); 821 "WHERE favicons.icon_type = ?"));
740 enumerator->statement_.BindInt(0, type); 822 enumerator->statement_.BindInt(0, type);
741 return enumerator->statement_.is_valid(); 823 return enumerator->statement_.is_valid();
742 } 824 }
743 825
744 bool ThumbnailDatabase::MigrateIconMappingData(URLDatabase* url_db) { 826 bool ThumbnailDatabase::MigrateIconMappingData(URLDatabase* url_db) {
745 URLDatabase::IconMappingEnumerator e; 827 URLDatabase::IconMappingEnumerator e;
746 if (!url_db->InitIconMappingEnumeratorForEverything(&e)) 828 if (!url_db->InitIconMappingEnumeratorForEverything(&e))
(...skipping 289 matching lines...) Expand 10 before | Expand all | Expand 10 after
1036 } 1118 }
1037 parsing_errors |= !base::StringToInt(t.token(), &height); 1119 parsing_errors |= !base::StringToInt(t.token(), &height);
1038 favicon_sizes->push_back(gfx::Size(width, height)); 1120 favicon_sizes->push_back(gfx::Size(width, height));
1039 } 1121 }
1040 1122
1041 if (parsing_errors) 1123 if (parsing_errors)
1042 favicon_sizes->clear(); 1124 favicon_sizes->clear();
1043 } 1125 }
1044 1126
1045 } // namespace history 1127 } // namespace history
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698