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

Side by Side Diff: components/history/core/browser/thumbnail_database.cc

Issue 2856873002: [Thumbnails DB] Allow setting last_requested time when accessing favicons. (Closed)
Patch Set: Peter's comments #2 Created 3 years, 6 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
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 "components/history/core/browser/thumbnail_database.h" 5 #include "components/history/core/browser/thumbnail_database.h"
6 6
7 #include <stddef.h> 7 #include <stddef.h>
8 #include <stdint.h> 8 #include <stdint.h>
9 #include <algorithm> 9 #include <algorithm>
10 #include <string> 10 #include <string>
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after
57 // favicons. There is a separate row for every size in a 57 // favicons. There is a separate row for every size in a
58 // multi resolution bitmap. The bitmap data is associated 58 // multi resolution bitmap. The bitmap data is associated
59 // to the favicon via the |icon_id| field which matches 59 // to the favicon via the |icon_id| field which matches
60 // the |id| field in the appropriate row in the |favicons| 60 // the |id| field in the appropriate row in the |favicons|
61 // table. 61 // table.
62 // 62 //
63 // id Unique ID. 63 // id Unique ID.
64 // icon_id The ID of the favicon that the bitmap is associated to. 64 // icon_id The ID of the favicon that the bitmap is associated to.
65 // last_updated The time at which this favicon was inserted into the 65 // last_updated The time at which this favicon was inserted into the
66 // table. This is used to determine if it needs to be 66 // table. This is used to determine if it needs to be
67 // redownloaded from the web. 67 // redownloaded from the web. Value 0 denotes that the bitmap
68 // has been explicitly expired.
68 // image_data PNG encoded data of the favicon. 69 // image_data PNG encoded data of the favicon.
69 // width Pixel width of |image_data|. 70 // width Pixel width of |image_data|.
70 // height Pixel height of |image_data|. 71 // height Pixel height of |image_data|.
71 // last_requested The time at which this bitmap was last requested. This is 72 // last_requested The time at which this bitmap was last requested. This is
72 // used to determine the priority with which the bitmap 73 // only used for bitmaps of type ON_DEMAND, for clearing old
brettw 2017/06/19 19:31:07 Can you reword this comment a bit? It reads to me
jkrcal 2017/06/21 16:05:50 Done.
73 // should be retained on cleanup. 74 // entries. (On-demand bitmaps cannot get cleared along with
75 // expired visits in history DB.) On-demand bitmaps are
76 // defined by last_requested>0 and thus this field should
77 // never get updated for bitmaps of type ON_VISIT.
74 78
75 namespace { 79 namespace {
76 80
77 // For this database, schema migrations are deprecated after two 81 // For this database, schema migrations are deprecated after two
78 // years. This means that the oldest non-deprecated version should be 82 // years. This means that the oldest non-deprecated version should be
79 // two years old or greater (thus the migrations to get there are 83 // two years old or greater (thus the migrations to get there are
80 // older). Databases containing deprecated versions will be cleared 84 // older). Databases containing deprecated versions will be cleared
81 // at startup. Since this database is a cache, losing old data is not 85 // at startup. Since this database is a cache, losing old data is not
82 // fatal (in fact, very old data may be expired immediately at startup 86 // fatal (in fact, very old data may be expired immediately at startup
83 // anyhow). 87 // anyhow).
(...skipping 412 matching lines...) Expand 10 before | Expand all | Expand 10 after
496 500
497 if (last_requested) 501 if (last_requested)
498 *last_requested = base::Time::FromInternalValue(statement.ColumnInt64(4)); 502 *last_requested = base::Time::FromInternalValue(statement.ColumnInt64(4));
499 503
500 return true; 504 return true;
501 } 505 }
502 506
503 FaviconBitmapID ThumbnailDatabase::AddFaviconBitmap( 507 FaviconBitmapID ThumbnailDatabase::AddFaviconBitmap(
504 favicon_base::FaviconID icon_id, 508 favicon_base::FaviconID icon_id,
505 const scoped_refptr<base::RefCountedMemory>& icon_data, 509 const scoped_refptr<base::RefCountedMemory>& icon_data,
510 FaviconBitmapType type,
506 base::Time time, 511 base::Time time,
507 const gfx::Size& pixel_size) { 512 const gfx::Size& pixel_size) {
508 DCHECK(icon_id); 513 DCHECK(icon_id);
509 sql::Statement statement(db_.GetCachedStatement(SQL_FROM_HERE, 514
510 "INSERT INTO favicon_bitmaps (icon_id, image_data, last_updated, width, " 515 sql::Statement statement(db_.GetCachedStatement(
511 "height) VALUES (?, ?, ?, ?, ?)")); 516 SQL_FROM_HERE,
517 "INSERT INTO favicon_bitmaps (icon_id, image_data, last_updated, "
518 "last_requested, width, height) VALUES (?, ?, ?, ?, ?, ?)"));
519
512 statement.BindInt64(0, icon_id); 520 statement.BindInt64(0, icon_id);
513 if (icon_data.get() && icon_data->size()) { 521 if (icon_data.get() && icon_data->size()) {
514 statement.BindBlob(1, icon_data->front(), 522 statement.BindBlob(1, icon_data->front(),
515 static_cast<int>(icon_data->size())); 523 static_cast<int>(icon_data->size()));
516 } else { 524 } else {
517 statement.BindNull(1); 525 statement.BindNull(1);
518 } 526 }
519 statement.BindInt64(2, time.ToInternalValue()); 527
520 statement.BindInt(3, pixel_size.width()); 528 // On-visit bitmaps:
521 statement.BindInt(4, pixel_size.height()); 529 // - keep track of last_updated: last write time is used for expiration;
530 // - always have last_requested==0: no need to keep track of last read time.
531 statement.BindInt64(2, type == ON_VISIT ? time.ToInternalValue() : 0);
532 // On-demand bitmaps:
533 // - always have last_updated==0: last write time is not stored as they are
534 // always expired and thus ready to be replaced by ON_VISIT icons;
535 // - keep track of last_requested: last read time is used for cache eviction.
536 statement.BindInt64(3, type == ON_DEMAND ? time.ToInternalValue() : 0);
537
538 statement.BindInt(4, pixel_size.width());
539 statement.BindInt(5, pixel_size.height());
522 540
523 if (!statement.Run()) 541 if (!statement.Run())
524 return 0; 542 return 0;
525 return db_.GetLastInsertRowId(); 543 return db_.GetLastInsertRowId();
526 } 544 }
527 545
528 bool ThumbnailDatabase::SetFaviconBitmap( 546 bool ThumbnailDatabase::SetFaviconBitmap(
529 FaviconBitmapID bitmap_id, 547 FaviconBitmapID bitmap_id,
530 scoped_refptr<base::RefCountedMemory> bitmap_data, 548 scoped_refptr<base::RefCountedMemory> bitmap_data,
531 base::Time time) { 549 base::Time time) {
532 DCHECK(bitmap_id); 550 DCHECK(bitmap_id);
533 sql::Statement statement(db_.GetCachedStatement(SQL_FROM_HERE, 551 // By updating last_updated timestamp, we assume the icon is of type ON_VISIT.
534 "UPDATE favicon_bitmaps SET image_data=?, last_updated=? WHERE id=?")); 552 // If it is ON_DEMAND, reset last_requested to 0 and thus silently change the
553 // type to ON_VISIT.
554 sql::Statement statement(
555 db_.GetCachedStatement(SQL_FROM_HERE,
556 "UPDATE favicon_bitmaps SET image_data=?, "
557 "last_updated=?, last_requested=? WHERE id=?"));
535 if (bitmap_data.get() && bitmap_data->size()) { 558 if (bitmap_data.get() && bitmap_data->size()) {
536 statement.BindBlob(0, bitmap_data->front(), 559 statement.BindBlob(0, bitmap_data->front(),
537 static_cast<int>(bitmap_data->size())); 560 static_cast<int>(bitmap_data->size()));
538 } else { 561 } else {
539 statement.BindNull(0); 562 statement.BindNull(0);
540 } 563 }
541 statement.BindInt64(1, time.ToInternalValue()); 564 statement.BindInt64(1, time.ToInternalValue());
542 statement.BindInt64(2, bitmap_id); 565 statement.BindInt64(2, 0);
566 statement.BindInt64(3, bitmap_id);
543 567
544 return statement.Run(); 568 return statement.Run();
545 } 569 }
546 570
547 bool ThumbnailDatabase::SetFaviconBitmapLastUpdateTime( 571 bool ThumbnailDatabase::SetFaviconBitmapLastUpdateTime(
548 FaviconBitmapID bitmap_id, 572 FaviconBitmapID bitmap_id,
549 base::Time time) { 573 base::Time time) {
550 DCHECK(bitmap_id); 574 DCHECK(bitmap_id);
551 sql::Statement statement(db_.GetCachedStatement(SQL_FROM_HERE, 575 // By updating last_updated timestamp, we assume the icon is of type ON_VISIT.
552 "UPDATE favicon_bitmaps SET last_updated=? WHERE id=?")); 576 // If it is ON_DEMAND, reset last_requested to 0 and thus silently change the
577 // type to ON_VISIT.
578 sql::Statement statement(
579 db_.GetCachedStatement(SQL_FROM_HERE,
580 "UPDATE favicon_bitmaps SET last_updated=?, "
581 "last_requested=? WHERE id=?"));
553 statement.BindInt64(0, time.ToInternalValue()); 582 statement.BindInt64(0, time.ToInternalValue());
554 statement.BindInt64(1, bitmap_id); 583 statement.BindInt64(1, 0);
584 statement.BindInt64(2, bitmap_id);
555 return statement.Run(); 585 return statement.Run();
556 } 586 }
557 587
558 bool ThumbnailDatabase::SetFaviconBitmapLastRequestedTime( 588 bool ThumbnailDatabase::TouchOnDemandFavicon(const GURL& icon_url,
559 FaviconBitmapID bitmap_id, 589 base::Time time) {
560 base::Time time) { 590 // Look up the icon ids for the url.
561 DCHECK(bitmap_id); 591 sql::Statement id_statement(db_.GetCachedStatement(
562 sql::Statement statement(db_.GetCachedStatement(SQL_FROM_HERE, 592 SQL_FROM_HERE, "SELECT id FROM favicons WHERE url=?"));
563 "UPDATE favicon_bitmaps SET last_requested=? WHERE id=?")); 593 id_statement.BindString(0, URLDatabase::GURLToDatabaseURL(icon_url));
564 statement.BindInt64(0, time.ToInternalValue()); 594
565 statement.BindInt64(1, bitmap_id); 595 while (id_statement.Step()) {
566 return statement.Run(); 596 favicon_base::FaviconID icon_id = id_statement.ColumnInt64(0);
597
598 // Update the time only for ON_DEMAND bitmaps (i.e. with last_requested >
599 // 0). For performance reasons, update the time only if the currently stored
600 // time is old enough (UPDATEs where the WHERE condition does not match any
601 // entries are way faster than UPDATEs that really change some data).
602 sql::Statement statement(db_.GetCachedStatement(
603 SQL_FROM_HERE,
604 "UPDATE favicon_bitmaps SET last_requested=? WHERE icon_id=? AND "
605 "last_requested>0 AND last_requested<=?"));
606 statement.BindInt64(0, time.ToInternalValue());
607 statement.BindInt64(1, icon_id);
608 base::Time max_time =
609 time - base::TimeDelta::FromDays(kFaviconUpdateLastRequestedAfterDays);
pkotwicz 2017/06/09 23:47:23 Nit: You can move the initialization of |max_time|
jkrcal 2017/06/21 16:05:50 Done.
610 statement.BindInt64(2, max_time.ToInternalValue());
611 if (!statement.Run())
612 return false;
613 }
614 return true;
567 } 615 }
568 616
569 bool ThumbnailDatabase::DeleteFaviconBitmap(FaviconBitmapID bitmap_id) { 617 bool ThumbnailDatabase::DeleteFaviconBitmap(FaviconBitmapID bitmap_id) {
570 sql::Statement statement(db_.GetCachedStatement(SQL_FROM_HERE, 618 sql::Statement statement(db_.GetCachedStatement(SQL_FROM_HERE,
571 "DELETE FROM favicon_bitmaps WHERE id=?")); 619 "DELETE FROM favicon_bitmaps WHERE id=?"));
572 statement.BindInt64(0, bitmap_id); 620 statement.BindInt64(0, bitmap_id);
573 return statement.Run(); 621 return statement.Run();
574 } 622 }
575 623
576 bool ThumbnailDatabase::SetFaviconOutOfDate(favicon_base::FaviconID icon_id) { 624 bool ThumbnailDatabase::SetFaviconOutOfDate(favicon_base::FaviconID icon_id) {
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after
627 675
628 if (!statement.Run()) 676 if (!statement.Run())
629 return 0; 677 return 0;
630 return db_.GetLastInsertRowId(); 678 return db_.GetLastInsertRowId();
631 } 679 }
632 680
633 favicon_base::FaviconID ThumbnailDatabase::AddFavicon( 681 favicon_base::FaviconID ThumbnailDatabase::AddFavicon(
634 const GURL& icon_url, 682 const GURL& icon_url,
635 favicon_base::IconType icon_type, 683 favicon_base::IconType icon_type,
636 const scoped_refptr<base::RefCountedMemory>& icon_data, 684 const scoped_refptr<base::RefCountedMemory>& icon_data,
685 FaviconBitmapType type,
637 base::Time time, 686 base::Time time,
638 const gfx::Size& pixel_size) { 687 const gfx::Size& pixel_size) {
639 favicon_base::FaviconID icon_id = AddFavicon(icon_url, icon_type); 688 favicon_base::FaviconID icon_id = AddFavicon(icon_url, icon_type);
640 if (!icon_id || !AddFaviconBitmap(icon_id, icon_data, time, pixel_size)) 689 if (!icon_id || !AddFaviconBitmap(icon_id, icon_data, type, time, pixel_size))
641 return 0; 690 return 0;
642 691
643 return icon_id; 692 return icon_id;
644 } 693 }
645 694
646 bool ThumbnailDatabase::DeleteFavicon(favicon_base::FaviconID id) { 695 bool ThumbnailDatabase::DeleteFavicon(favicon_base::FaviconID id) {
647 sql::Statement statement; 696 sql::Statement statement;
648 statement.Assign(db_.GetCachedStatement(SQL_FROM_HERE, 697 statement.Assign(db_.GetCachedStatement(SQL_FROM_HERE,
649 "DELETE FROM favicons WHERE id = ?")); 698 "DELETE FROM favicons WHERE id = ?"));
650 statement.BindInt64(0, id); 699 statement.BindInt64(0, id);
(...skipping 407 matching lines...) Expand 10 before | Expand all | Expand 10 after
1058 meta_table_.SetVersionNumber(8); 1107 meta_table_.SetVersionNumber(8);
1059 meta_table_.SetCompatibleVersionNumber(std::min(8, kCompatibleVersionNumber)); 1108 meta_table_.SetCompatibleVersionNumber(std::min(8, kCompatibleVersionNumber));
1060 return true; 1109 return true;
1061 } 1110 }
1062 1111
1063 bool ThumbnailDatabase::IsFaviconDBStructureIncorrect() { 1112 bool ThumbnailDatabase::IsFaviconDBStructureIncorrect() {
1064 return !db_.IsSQLValid("SELECT id, url, icon_type FROM favicons"); 1113 return !db_.IsSQLValid("SELECT id, url, icon_type FROM favicons");
1065 } 1114 }
1066 1115
1067 } // namespace history 1116 } // namespace history
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698