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

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: 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 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"
11 #include "base/file_util.h" 11 #include "base/file_util.h"
12 #include "base/memory/ref_counted_memory.h" 12 #include "base/memory/ref_counted_memory.h"
13 #include "base/string_number_conversions.h"
14 #include "base/string_tokenizer.h"
13 #include "base/string_util.h" 15 #include "base/string_util.h"
14 #include "base/time.h" 16 #include "base/time.h"
15 #include "base/utf_string_conversions.h" 17 #include "base/utf_string_conversions.h"
16 #include "chrome/browser/diagnostics/sqlite_diagnostics.h" 18 #include "chrome/browser/diagnostics/sqlite_diagnostics.h"
17 #include "chrome/browser/history/history_publisher.h" 19 #include "chrome/browser/history/history_publisher.h"
18 #include "chrome/browser/history/top_sites.h" 20 #include "chrome/browser/history/top_sites.h"
19 #include "chrome/browser/history/url_database.h" 21 #include "chrome/browser/history/url_database.h"
20 #include "chrome/common/thumbnail_score.h" 22 #include "chrome/common/thumbnail_score.h"
21 #include "sql/statement.h" 23 #include "sql/statement.h"
22 #include "sql/transaction.h" 24 #include "sql/transaction.h"
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
64 // 66 //
65 // id Unique ID. 67 // id Unique ID.
66 // icon_id The ID of the favicon that the bitmap is associated to. 68 // icon_id The ID of the favicon that the bitmap is associated to.
67 // last_updated The time at which this favicon was inserted into the 69 // last_updated The time at which this favicon was inserted into the
68 // table. This is used to determine if it needs to be 70 // table. This is used to determine if it needs to be
69 // redownloaded from the web. 71 // redownloaded from the web.
70 // image_data PNG encoded data of the favicon. 72 // image_data PNG encoded data of the favicon.
71 // width Pixel width of |image_data|. 73 // width Pixel width of |image_data|.
72 // height Pixel height of |image_data|. 74 // height Pixel height of |image_data|.
73 75
74
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::GetFaviconBitmapIDSizeList(
452 FaviconID icon_id,
453 std::vector<FaviconBitmapIDSize>* bitmap_id_size_list) {
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 FaviconBitmapIDSize bitmap_id_size;
463 bitmap_id_size.bitmap_id = statement.ColumnInt(0);
464 bitmap_id_size.pixel_size = gfx::Size(statement.ColumnInt(1),
465 statement.ColumnInt(2));
466 bitmap_id_size_list->push_back(bitmap_id_size);
467 }
468 return result;
469 }
470
450 bool ThumbnailDatabase::GetFaviconBitmaps( 471 bool ThumbnailDatabase::GetFaviconBitmaps(
451 FaviconID icon_id, 472 FaviconID icon_id,
452 std::vector<FaviconBitmap>* favicon_bitmaps) { 473 std::vector<FaviconBitmap>* favicon_bitmaps) {
453 DCHECK(icon_id); 474 DCHECK(icon_id);
454 sql::Statement statement(db_.GetCachedStatement(SQL_FROM_HERE, 475 sql::Statement statement(db_.GetCachedStatement(SQL_FROM_HERE,
455 "SELECT id, last_updated, image_data, width, height FROM favicon_bitmaps " 476 "SELECT id, last_updated, image_data, width, height FROM favicon_bitmaps "
456 "WHERE icon_id=?")); 477 "WHERE icon_id=?"));
457 statement.BindInt64(0, icon_id); 478 statement.BindInt64(0, icon_id);
458 479
459 bool result = false; 480 bool result = false;
(...skipping 12 matching lines...) Expand all
472 statement.ColumnBlobAsVector(2, &data->data()); 493 statement.ColumnBlobAsVector(2, &data->data());
473 favicon_bitmap.bitmap_data = data; 494 favicon_bitmap.bitmap_data = data;
474 } 495 }
475 favicon_bitmap.pixel_size = gfx::Size(statement.ColumnInt(3), 496 favicon_bitmap.pixel_size = gfx::Size(statement.ColumnInt(3),
476 statement.ColumnInt(4)); 497 statement.ColumnInt(4));
477 favicon_bitmaps->push_back(favicon_bitmap); 498 favicon_bitmaps->push_back(favicon_bitmap);
478 } 499 }
479 return result; 500 return result;
480 } 501 }
481 502
503 bool ThumbnailDatabase::GetFaviconBitmap(
504 FaviconBitmapID bitmap_id,
505 base::Time* last_updated,
506 scoped_refptr<base::RefCountedMemory>* png_icon_data,
507 gfx::Size* pixel_size) {
508 DCHECK(bitmap_id);
509 sql::Statement statement(db_.GetCachedStatement(SQL_FROM_HERE,
510 "SELECT last_updated, image_data, width, height FROM favicon_bitmaps "
511 "WHERE id=?"));
512 statement.BindInt64(0, bitmap_id);
513
514 if (!statement.Step())
515 return false;
516
517 if (last_updated)
518 *last_updated = base::Time::FromTimeT(statement.ColumnInt64(0));
519
520 if (png_icon_data && statement.ColumnByteLength(1) > 0) {
521 scoped_refptr<base::RefCountedBytes> data(new base::RefCountedBytes());
522 statement.ColumnBlobAsVector(2, &data->data());
523 *png_icon_data = data;
524 }
525
526 if (pixel_size) {
527 *pixel_size = gfx::Size(statement.ColumnInt(2),
528 statement.ColumnInt(3));
529 }
530 return true;
531 }
532
482 FaviconBitmapID ThumbnailDatabase::AddFaviconBitmap( 533 FaviconBitmapID ThumbnailDatabase::AddFaviconBitmap(
483 FaviconID icon_id, 534 FaviconID icon_id,
484 const scoped_refptr<base::RefCountedMemory>& icon_data, 535 const scoped_refptr<base::RefCountedMemory>& icon_data,
485 base::Time time, 536 base::Time time,
486 const gfx::Size& pixel_size) { 537 const gfx::Size& pixel_size) {
487 DCHECK(icon_id); 538 DCHECK(icon_id);
488 sql::Statement statement(db_.GetCachedStatement(SQL_FROM_HERE, 539 sql::Statement statement(db_.GetCachedStatement(SQL_FROM_HERE,
489 "INSERT INTO favicon_bitmaps (icon_id, image_data, last_updated, width, " 540 "INSERT INTO favicon_bitmaps (icon_id, image_data, last_updated, width, "
490 "height) VALUES (?, ?, ?, ?, ?)")); 541 "height) VALUES (?, ?, ?, ?, ?)"));
491 statement.BindInt64(0, icon_id); 542 statement.BindInt64(0, icon_id);
492 if (icon_data->size()) { 543 if (icon_data->size()) {
493 statement.BindBlob(1, icon_data->front(), 544 statement.BindBlob(1, icon_data->front(),
494 static_cast<int>(icon_data->size())); 545 static_cast<int>(icon_data->size()));
495 } else { 546 } else {
496 statement.BindNull(1); 547 statement.BindNull(1);
497 } 548 }
498 statement.BindInt64(2, time.ToTimeT()); 549 statement.BindInt64(2, time.ToTimeT());
499 statement.BindInt(3, pixel_size.width()); 550 statement.BindInt(3, pixel_size.width());
500 statement.BindInt(4, pixel_size.height()); 551 statement.BindInt(4, pixel_size.height());
501 552
502 if (!statement.Run()) 553 if (!statement.Run())
503 return 0; 554 return 0;
504 return db_.GetLastInsertRowId(); 555 return db_.GetLastInsertRowId();
505 } 556 }
506 557
507 bool ThumbnailDatabase::DeleteFaviconBitmapsForFavicon(FaviconID icon_id) { 558 bool ThumbnailDatabase::SetFaviconBitmap(
559 FaviconBitmapID bitmap_id,
560 scoped_refptr<base::RefCountedMemory> icon_data,
561 base::Time time) {
562 DCHECK(bitmap_id);
508 sql::Statement statement(db_.GetCachedStatement(SQL_FROM_HERE, 563 sql::Statement statement(db_.GetCachedStatement(SQL_FROM_HERE,
509 "DELETE FROM favicon_bitmaps WHERE icon_id=?")); 564 "UPDATE favicon_bitmaps SET image_data=?, last_updated=? WHERE id=?"));
510 statement.BindInt64(0, icon_id); 565 if (icon_data.get() && icon_data->size()) {
566 statement.BindBlob(0, icon_data->front(),
567 static_cast<int>(icon_data->size()));
568 } else {
569 statement.BindNull(0);
570 }
571 statement.BindInt64(1, time.ToTimeT());
572 statement.BindInt64(2, bitmap_id);
573
574 return statement.Run();
575 }
576
577 bool ThumbnailDatabase::DeleteFaviconBitmap(FaviconBitmapID bitmap_id) {
578 sql::Statement statement(db_.GetCachedStatement(SQL_FROM_HERE,
579 "DELETE FROM favicon_bitmaps WHERE id=?"));
580 statement.BindInt64(0, bitmap_id);
511 return statement.Run(); 581 return statement.Run();
512 } 582 }
513 583
514 bool ThumbnailDatabase::SetFaviconSizes(FaviconID icon_id, 584 bool ThumbnailDatabase::SetFaviconSizes(FaviconID icon_id,
515 const std::string& sizes) { 585 const std::vector<gfx::Size>& sizes) {
586 std::string sizes_as_string;
587 FaviconSizesToDatabaseString(sizes, &sizes_as_string);
588
516 sql::Statement statement(db_.GetCachedStatement(SQL_FROM_HERE, 589 sql::Statement statement(db_.GetCachedStatement(SQL_FROM_HERE,
517 "UPDATE favicons SET sizes=? WHERE id=?")); 590 "UPDATE favicons SET sizes=? WHERE id=?"));
518 statement.BindString(0, sizes); 591 statement.BindString(0, sizes_as_string);
519 statement.BindInt64(1, icon_id); 592 statement.BindInt64(1, icon_id);
520 593
521 return statement.Run(); 594 return statement.Run();
522 } 595 }
523 596
524 bool ThumbnailDatabase::SetFaviconOutOfDate(FaviconID icon_id) { 597 bool ThumbnailDatabase::SetFaviconOutOfDate(FaviconID icon_id) {
525 sql::Statement statement(db_.GetCachedStatement(SQL_FROM_HERE, 598 sql::Statement statement(db_.GetCachedStatement(SQL_FROM_HERE,
526 "UPDATE favicon_bitmaps SET last_updated=? WHERE icon_id=?")); 599 "UPDATE favicon_bitmaps SET last_updated=? WHERE icon_id=?"));
527 statement.BindInt64(0, 0); 600 statement.BindInt64(0, 0);
528 statement.BindInt64(1, icon_id); 601 statement.BindInt64(1, icon_id);
529 602
530 return statement.Run(); 603 return statement.Run();
531 } 604 }
532 605
533 FaviconID ThumbnailDatabase::GetFaviconIDForFaviconURL(const GURL& icon_url, 606 FaviconID ThumbnailDatabase::GetFaviconIDForFaviconURL(const GURL& icon_url,
534 int required_icon_type, 607 int required_icon_type) {
535 IconType* icon_type) {
536 sql::Statement statement(db_.GetCachedStatement(SQL_FROM_HERE, 608 sql::Statement statement(db_.GetCachedStatement(SQL_FROM_HERE,
537 "SELECT id, icon_type FROM favicons WHERE url=? AND (icon_type & ? > 0) " 609 "SELECT id FROM favicons WHERE url=? AND (icon_type & ? > 0) "
538 "ORDER BY icon_type DESC")); 610 "ORDER BY icon_type DESC"));
539 statement.BindString(0, URLDatabase::GURLToDatabaseURL(icon_url)); 611 statement.BindString(0, URLDatabase::GURLToDatabaseURL(icon_url));
540 statement.BindInt(1, required_icon_type); 612 statement.BindInt(1, required_icon_type);
541 613
542 if (!statement.Step()) 614 if (!statement.Step())
543 return 0; // not cached 615 return 0; // not cached
544
545 if (icon_type)
546 *icon_type = static_cast<IconType>(statement.ColumnInt(1));
547 return statement.ColumnInt64(0); 616 return statement.ColumnInt64(0);
548 } 617 }
549 618
550 bool ThumbnailDatabase::GetFavicon(
551 FaviconID icon_id,
552 base::Time* last_updated,
553 scoped_refptr<base::RefCountedMemory>* png_icon_data,
554 GURL* icon_url,
555 IconType* icon_type) {
556 DCHECK(icon_id);
557
558 std::vector<FaviconBitmap> favicon_bitmaps;
559 if (!GetFaviconBitmaps(icon_id, &favicon_bitmaps))
560 return false;
561
562 if (favicon_bitmaps.empty())
563 return false;
564
565 if (last_updated)
566 *last_updated = favicon_bitmaps[0].last_updated;
567
568 *png_icon_data = favicon_bitmaps[0].bitmap_data;
569
570 return GetFaviconHeader(icon_id, icon_url, icon_type, NULL);
571 }
572
573 bool ThumbnailDatabase::GetFaviconHeader( 619 bool ThumbnailDatabase::GetFaviconHeader(
574 FaviconID icon_id, 620 FaviconID icon_id,
575 GURL* icon_url, 621 GURL* icon_url,
576 IconType* icon_type, 622 IconType* icon_type,
577 std::string* sizes) { 623 std::vector<gfx::Size>* sizes) {
578 DCHECK(icon_id); 624 DCHECK(icon_id);
579 625
580 sql::Statement statement(db_.GetCachedStatement(SQL_FROM_HERE, 626 sql::Statement statement(db_.GetCachedStatement(SQL_FROM_HERE,
581 "SELECT url, icon_type, sizes FROM favicons WHERE id=?")); 627 "SELECT url, icon_type, sizes FROM favicons WHERE id=?"));
582 statement.BindInt64(0, icon_id); 628 statement.BindInt64(0, icon_id);
583 629
584 if (!statement.Step()) 630 if (!statement.Step())
585 return false; // No entry for the id. 631 return false; // No entry for the id.
586 632
587 if (icon_url) 633 if (icon_url)
588 *icon_url = GURL(statement.ColumnString(0)); 634 *icon_url = GURL(statement.ColumnString(0));
589 if (icon_type) 635 if (icon_type)
590 *icon_type = static_cast<history::IconType>(statement.ColumnInt(1)); 636 *icon_type = static_cast<history::IconType>(statement.ColumnInt(1));
591 if (sizes) 637 if (sizes) {
592 *sizes = statement.ColumnString(2); 638 if (!DatabaseStringToFaviconSizes(statement.ColumnString(2), sizes))
639 return false;
640 }
593 641
594 return true; 642 return true;
595 } 643 }
596 644
597 FaviconID ThumbnailDatabase::AddFavicon(const GURL& icon_url, 645 FaviconID ThumbnailDatabase::AddFavicon(const GURL& icon_url,
598 IconType icon_type) { 646 IconType icon_type) {
599 647
600 sql::Statement statement(db_.GetCachedStatement(SQL_FROM_HERE, 648 sql::Statement statement(db_.GetCachedStatement(SQL_FROM_HERE,
601 "INSERT INTO favicons (url, icon_type) VALUES (?, ?)")); 649 "INSERT INTO favicons (url, icon_type) VALUES (?, ?)"));
602 statement.BindString(0, URLDatabase::GURLToDatabaseURL(icon_url)); 650 statement.BindString(0, URLDatabase::GURLToDatabaseURL(icon_url));
603 statement.BindInt(1, icon_type); 651 statement.BindInt(1, icon_type);
604 652
605 if (!statement.Run()) 653 if (!statement.Run())
606 return 0; 654 return 0;
607 return db_.GetLastInsertRowId(); 655 return db_.GetLastInsertRowId();
608 } 656 }
609 657
610 FaviconID ThumbnailDatabase::AddFavicon( 658 FaviconID ThumbnailDatabase::AddFavicon(
611 const GURL& icon_url, 659 const GURL& icon_url,
612 IconType icon_type, 660 IconType icon_type,
613 const std::string& sizes, 661 const std::vector<gfx::Size>& sizes,
614 const scoped_refptr<base::RefCountedMemory>& icon_data, 662 const scoped_refptr<base::RefCountedMemory>& icon_data,
615 base::Time time, 663 base::Time time,
616 const gfx::Size& pixel_size) { 664 const gfx::Size& pixel_size) {
617 FaviconID icon_id = AddFavicon(icon_url, icon_type); 665 FaviconID icon_id = AddFavicon(icon_url, icon_type);
618 if (!icon_id || 666 if (!icon_id ||
619 !SetFaviconSizes(icon_id, sizes) || 667 !SetFaviconSizes(icon_id, sizes) ||
620 !AddFaviconBitmap(icon_id, icon_data, time, pixel_size)) { 668 !AddFaviconBitmap(icon_id, icon_data, time, pixel_size)) {
621 return 0; 669 return 0;
622 } 670 }
623 return icon_id; 671 return icon_id;
624 } 672 }
625 673
626 bool ThumbnailDatabase::DeleteFavicon(FaviconID id) { 674 bool ThumbnailDatabase::DeleteFavicon(FaviconID id) {
627 sql::Statement statement; 675 sql::Statement statement;
628 statement.Assign(db_.GetCachedStatement(SQL_FROM_HERE, 676 statement.Assign(db_.GetCachedStatement(SQL_FROM_HERE,
629 "DELETE FROM favicons WHERE id = ?")); 677 "DELETE FROM favicons WHERE id = ?"));
630 statement.BindInt64(0, id); 678 statement.BindInt64(0, id);
631 if (!statement.Run()) 679 if (!statement.Run())
632 return false; 680 return false;
633 681
634 statement.Assign(db_.GetCachedStatement(SQL_FROM_HERE, 682 statement.Assign(db_.GetCachedStatement(SQL_FROM_HERE,
635 "DELETE FROM favicon_bitmaps WHERE icon_id = ?")); 683 "DELETE FROM favicon_bitmaps WHERE icon_id = ?"));
636 statement.BindInt64(0, id); 684 statement.BindInt64(0, id);
637 return statement.Run(); 685 return statement.Run();
638 } 686 }
639 687
640 bool ThumbnailDatabase::GetIconMappingForPageURL(const GURL& page_url, 688 bool ThumbnailDatabase::GetIconMappingsForPageURL(
641 IconType required_icon_type, 689 const GURL& page_url,
642 IconMapping* icon_mapping) { 690 int required_icon_types,
643 std::vector<IconMapping> icon_mappings; 691 std::vector<IconMapping>* filtered_mapping_data) {
644 if (!GetIconMappingsForPageURL(page_url, &icon_mappings)) 692 std::vector<IconMapping> mapping_data;
693 if (!GetIconMappingsForPageURL(page_url, &mapping_data))
645 return false; 694 return false;
646 695
647 for (std::vector<IconMapping>::iterator m = icon_mappings.begin(); 696 bool result = false;
648 m != icon_mappings.end(); ++m) { 697 for (std::vector<IconMapping>::iterator m = mapping_data.begin();
649 if (m->icon_type == required_icon_type) { 698 m != mapping_data.end(); ++m) {
650 if (icon_mapping != NULL) 699 if (m->icon_type & required_icon_types) {
651 *icon_mapping = *m; 700 result = true;
652 return true; 701 if (filtered_mapping_data == NULL)
702 return result;
703 filtered_mapping_data->push_back(*m);
653 } 704 }
654 } 705 }
655 706 return result;
656 return false;
657 } 707 }
658 708
659 bool ThumbnailDatabase::GetIconMappingsForPageURL( 709 bool ThumbnailDatabase::GetIconMappingsForPageURL(
660 const GURL& page_url, 710 const GURL& page_url,
661 std::vector<IconMapping>* mapping_data) { 711 std::vector<IconMapping>* mapping_data) {
662 sql::Statement statement(db_.GetCachedStatement(SQL_FROM_HERE, 712 sql::Statement statement(db_.GetCachedStatement(SQL_FROM_HERE,
663 "SELECT icon_mapping.id, icon_mapping.icon_id, favicons.icon_type " 713 "SELECT icon_mapping.id, icon_mapping.icon_id, favicons.icon_type, "
714 "favicons.url "
664 "FROM icon_mapping " 715 "FROM icon_mapping "
665 "INNER JOIN favicons " 716 "INNER JOIN favicons "
666 "ON icon_mapping.icon_id = favicons.id " 717 "ON icon_mapping.icon_id = favicons.id "
667 "WHERE icon_mapping.page_url=? " 718 "WHERE icon_mapping.page_url=? "
668 "ORDER BY favicons.icon_type DESC")); 719 "ORDER BY favicons.icon_type DESC"));
669 statement.BindString(0, URLDatabase::GURLToDatabaseURL(page_url)); 720 statement.BindString(0, URLDatabase::GURLToDatabaseURL(page_url));
670 721
671 bool result = false; 722 bool result = false;
672 while (statement.Step()) { 723 while (statement.Step()) {
673 result = true; 724 result = true;
(...skipping 23 matching lines...) Expand all
697 } 748 }
698 749
699 bool ThumbnailDatabase::DeleteIconMappings(const GURL& page_url) { 750 bool ThumbnailDatabase::DeleteIconMappings(const GURL& page_url) {
700 sql::Statement statement(db_.GetCachedStatement(SQL_FROM_HERE, 751 sql::Statement statement(db_.GetCachedStatement(SQL_FROM_HERE,
701 "DELETE FROM icon_mapping WHERE page_url = ?")); 752 "DELETE FROM icon_mapping WHERE page_url = ?"));
702 statement.BindString(0, URLDatabase::GURLToDatabaseURL(page_url)); 753 statement.BindString(0, URLDatabase::GURLToDatabaseURL(page_url));
703 754
704 return statement.Run(); 755 return statement.Run();
705 } 756 }
706 757
758 bool ThumbnailDatabase::DeleteIconMapping(IconMappingID mapping_id) {
759 sql::Statement statement(db_.GetCachedStatement(SQL_FROM_HERE,
760 "DELETE FROM icon_mapping WHERE id=?"));
761 statement.BindInt64(0, mapping_id);
762
763 return statement.Run();
764 }
765
707 bool ThumbnailDatabase::HasMappingFor(FaviconID id) { 766 bool ThumbnailDatabase::HasMappingFor(FaviconID id) {
708 sql::Statement statement(db_.GetCachedStatement(SQL_FROM_HERE, 767 sql::Statement statement(db_.GetCachedStatement(SQL_FROM_HERE,
709 "SELECT id FROM icon_mapping " 768 "SELECT id FROM icon_mapping "
710 "WHERE icon_id=?")); 769 "WHERE icon_id=?"));
711 statement.BindInt64(0, id); 770 statement.BindInt64(0, id);
712 771
713 return statement.Step(); 772 return statement.Step();
714 } 773 }
715 774
716 bool ThumbnailDatabase::CloneIconMapping(const GURL& old_page_url, 775 bool ThumbnailDatabase::CloneIconMappings(const GURL& old_page_url,
717 const GURL& new_page_url) { 776 const GURL& new_page_url) {
718 sql::Statement statement(db_.GetCachedStatement(SQL_FROM_HERE, 777 sql::Statement statement(db_.GetCachedStatement(SQL_FROM_HERE,
719 "SELECT icon_id FROM icon_mapping " 778 "SELECT icon_id FROM icon_mapping "
720 "WHERE page_url=?")); 779 "WHERE page_url=?"));
721 if (!statement.is_valid()) 780 if (!statement.is_valid())
722 return false; 781 return false;
723 782
724 // Do nothing if there are existing bindings 783 // Do nothing if there are existing bindings
725 statement.BindString(0, URLDatabase::GURLToDatabaseURL(new_page_url)); 784 statement.BindString(0, URLDatabase::GURLToDatabaseURL(new_page_url));
726 if (statement.Step()) 785 if (statement.Step())
727 return true; 786 return true;
728 787
729 statement.Assign(db_.GetCachedStatement(SQL_FROM_HERE, 788 statement.Assign(db_.GetCachedStatement(SQL_FROM_HERE,
730 "INSERT INTO icon_mapping (page_url, icon_id) " 789 "INSERT INTO icon_mapping (page_url, icon_id) "
731 "SELECT ?, icon_id FROM icon_mapping " 790 "SELECT ?, icon_id FROM icon_mapping "
732 "WHERE page_url = ?")); 791 "WHERE page_url = ?"));
733 792
734 statement.BindString(0, URLDatabase::GURLToDatabaseURL(new_page_url)); 793 statement.BindString(0, URLDatabase::GURLToDatabaseURL(new_page_url));
735 statement.BindString(1, URLDatabase::GURLToDatabaseURL(old_page_url)); 794 statement.BindString(1, URLDatabase::GURLToDatabaseURL(old_page_url));
736 return statement.Run(); 795 return statement.Run();
737 } 796 }
738 797
739 bool ThumbnailDatabase::InitIconMappingEnumerator( 798 bool ThumbnailDatabase::InitIconMappingEnumerator(
740 IconType type, 799 IconType type,
741 IconMappingEnumerator* enumerator) { 800 IconMappingEnumerator* enumerator) {
742 DCHECK(!enumerator->statement_.is_valid()); 801 DCHECK(!enumerator->statement_.is_valid());
743 enumerator->statement_.Assign(db_.GetCachedStatement( 802 enumerator->statement_.Assign(db_.GetCachedStatement(
744 SQL_FROM_HERE, 803 SQL_FROM_HERE,
745 "SELECT icon_mapping.id, icon_mapping.icon_id, favicons.icon_type, " 804 "SELECT icon_mapping.id, icon_mapping.icon_id, favicons.icon_type, "
746 "icon_mapping.page_url " 805 "favicons.url, icon_mapping.page_url "
747 "FROM icon_mapping JOIN favicons ON (" 806 "FROM icon_mapping JOIN favicons ON ("
748 "icon_mapping.icon_id = favicons.id) " 807 "icon_mapping.icon_id = favicons.id) "
749 "WHERE favicons.icon_type = ?")); 808 "WHERE favicons.icon_type = ?"));
750 enumerator->statement_.BindInt(0, type); 809 enumerator->statement_.BindInt(0, type);
751 return enumerator->statement_.is_valid(); 810 return enumerator->statement_.is_valid();
752 } 811 }
753 812
754 bool ThumbnailDatabase::MigrateIconMappingData(URLDatabase* url_db) { 813 bool ThumbnailDatabase::MigrateIconMappingData(URLDatabase* url_db) {
755 URLDatabase::IconMappingEnumerator e; 814 URLDatabase::IconMappingEnumerator e;
756 if (!url_db->InitIconMappingEnumeratorForEverything(&e)) 815 if (!url_db->InitIconMappingEnumeratorForEverything(&e))
(...skipping 253 matching lines...) Expand 10 before | Expand all | Expand 10 after
1010 db_.Execute("DROP TABLE favicons") && 1069 db_.Execute("DROP TABLE favicons") &&
1011 db_.Execute("ALTER TABLE temp_favicons RENAME TO favicons"); 1070 db_.Execute("ALTER TABLE temp_favicons RENAME TO favicons");
1012 if (!success) 1071 if (!success)
1013 return false; 1072 return false;
1014 1073
1015 meta_table_.SetVersionNumber(6); 1074 meta_table_.SetVersionNumber(6);
1016 meta_table_.SetCompatibleVersionNumber(std::min(6, kCompatibleVersionNumber)); 1075 meta_table_.SetCompatibleVersionNumber(std::min(6, kCompatibleVersionNumber));
1017 return true; 1076 return true;
1018 } 1077 }
1019 1078
1079 // static
1080 void ThumbnailDatabase::FaviconSizesToDatabaseString(
1081 const FaviconSizes& sizes,
1082 std::string* sizes_string) {
1083 std::vector<std::string> parts;
1084 for (std::vector<gfx::Size>::const_iterator it = sizes.begin();
1085 it != sizes.end(); ++it) {
1086 parts.push_back(base::IntToString(it->width()));
1087 parts.push_back(base::IntToString(it->height()));
1088 }
1089 *sizes_string = JoinString(parts, ' ');
1090 }
1091
1092 // static
1093 bool ThumbnailDatabase::DatabaseStringToFaviconSizes(
1094 const std::string sizes_string,
1095 FaviconSizes* sizes) {
1096 bool no_errors = true;
1097
1098 StringTokenizer t(sizes_string, " ");
1099 while (t.GetNext() && no_errors) {
1100 int width, height = 0;
1101 no_errors &= base::StringToInt(t.token(), &width);
1102 if (!t.GetNext()) {
1103 no_errors = false;
1104 break;
1105 }
1106 no_errors &= base::StringToInt(t.token(), &height);
1107 sizes->push_back(gfx::Size(width, height));
1108 }
1109
1110 if (!no_errors)
1111 sizes->clear();
1112
1113 return no_errors;
1114 }
1115
1020 } // namespace history 1116 } // namespace history
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698