| OLD | NEW |
| 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 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/text_database_manager.h" | 5 #include "chrome/browser/history/text_database_manager.h" |
| 6 | 6 |
| 7 #include "base/bind.h" | 7 #include "base/bind.h" |
| 8 #include "base/compiler_specific.h" | 8 #include "base/compiler_specific.h" |
| 9 #include "base/file_util.h" | 9 #include "base/file_util.h" |
| 10 #include "base/metrics/histogram.h" | 10 #include "base/metrics/histogram.h" |
| (...skipping 15 matching lines...) Expand all Loading... |
| 26 // The number of database files we will be attached to at once. | 26 // The number of database files we will be attached to at once. |
| 27 const int kCacheDBSize = 5; | 27 const int kCacheDBSize = 5; |
| 28 | 28 |
| 29 std::string ConvertStringForIndexer(const string16& input) { | 29 std::string ConvertStringForIndexer(const string16& input) { |
| 30 // TODO(evanm): other transformations here? | 30 // TODO(evanm): other transformations here? |
| 31 return UTF16ToUTF8(CollapseWhitespace(input, false)); | 31 return UTF16ToUTF8(CollapseWhitespace(input, false)); |
| 32 } | 32 } |
| 33 | 33 |
| 34 // Data older than this will be committed to the full text index even if we | 34 // Data older than this will be committed to the full text index even if we |
| 35 // haven't gotten a title and/or body. | 35 // haven't gotten a title and/or body. |
| 36 const int kExpirationSec = 20; | 36 const int kExpirationSeconds = 20; |
| 37 | 37 |
| 38 } // namespace | 38 } // namespace |
| 39 | 39 |
| 40 // TextDatabaseManager::ChangeSet ---------------------------------------------- | 40 // TextDatabaseManager::ChangeSet ---------------------------------------------- |
| 41 | 41 |
| 42 TextDatabaseManager::ChangeSet::ChangeSet() {} | 42 TextDatabaseManager::ChangeSet::ChangeSet() {} |
| 43 | 43 |
| 44 TextDatabaseManager::ChangeSet::~ChangeSet() {} | 44 TextDatabaseManager::ChangeSet::~ChangeSet() {} |
| 45 | 45 |
| 46 // TextDatabaseManager::PageInfo ----------------------------------------------- | 46 // TextDatabaseManager::PageInfo ----------------------------------------------- |
| (...skipping 17 matching lines...) Expand all Loading... |
| 64 } | 64 } |
| 65 | 65 |
| 66 void TextDatabaseManager::PageInfo::set_body(const string16& bdy) { | 66 void TextDatabaseManager::PageInfo::set_body(const string16& bdy) { |
| 67 if (bdy.empty()) // Make the body nonempty when we set it for EverybodySet. | 67 if (bdy.empty()) // Make the body nonempty when we set it for EverybodySet. |
| 68 body_ = ASCIIToUTF16(" "); | 68 body_ = ASCIIToUTF16(" "); |
| 69 else | 69 else |
| 70 body_ = bdy; | 70 body_ = bdy; |
| 71 } | 71 } |
| 72 | 72 |
| 73 bool TextDatabaseManager::PageInfo::Expired(TimeTicks now) const { | 73 bool TextDatabaseManager::PageInfo::Expired(TimeTicks now) const { |
| 74 return now - added_time_ > TimeDelta::FromSeconds(kExpirationSec); | 74 return now - added_time_ > base::TimeDelta::FromSeconds(kExpirationSeconds); |
| 75 } | 75 } |
| 76 | 76 |
| 77 // TextDatabaseManager --------------------------------------------------------- | 77 // TextDatabaseManager --------------------------------------------------------- |
| 78 | 78 |
| 79 TextDatabaseManager::TextDatabaseManager(const FilePath& dir, | 79 TextDatabaseManager::TextDatabaseManager(const FilePath& dir, |
| 80 URLDatabase* url_database, | 80 URLDatabase* url_database, |
| 81 VisitDatabase* visit_database) | 81 VisitDatabase* visit_database) |
| 82 : dir_(dir), | 82 : dir_(dir), |
| 83 url_database_(url_database), | 83 url_database_(url_database), |
| 84 visit_database_(visit_database), | 84 visit_database_(visit_database), |
| (...skipping 116 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 201 if (!visit_database_->GetMostRecentVisitForURL(url_row.id(), &visit)) | 201 if (!visit_database_->GetMostRecentVisitForURL(url_row.id(), &visit)) |
| 202 return; // No recent visit, give up. | 202 return; // No recent visit, give up. |
| 203 | 203 |
| 204 if (visit.is_indexed) { | 204 if (visit.is_indexed) { |
| 205 // If this page was already indexed, we could have a body that came in | 205 // If this page was already indexed, we could have a body that came in |
| 206 // first and we don't want to overwrite it. We could go query for the | 206 // first and we don't want to overwrite it. We could go query for the |
| 207 // current body, or have a special setter for only the title, but this is | 207 // current body, or have a special setter for only the title, but this is |
| 208 // not worth it for this edge case. | 208 // not worth it for this edge case. |
| 209 // | 209 // |
| 210 // It will be almost impossible for the title to take longer than | 210 // It will be almost impossible for the title to take longer than |
| 211 // kExpirationSec yet we got a body in less than that time, since the | 211 // kExpirationSeconds yet we got a body in less than that time, since |
| 212 // title should always come in first. | 212 // the title should always come in first. |
| 213 return; | 213 return; |
| 214 } | 214 } |
| 215 | 215 |
| 216 AddPageData(url, url_row.id(), visit.visit_id, visit.visit_time, | 216 AddPageData(url, url_row.id(), visit.visit_id, visit.visit_time, |
| 217 title, string16()); | 217 title, string16()); |
| 218 return; // We don't know about this page, give up. | 218 return; // We don't know about this page, give up. |
| 219 } | 219 } |
| 220 | 220 |
| 221 PageInfo& info = found->second; | 221 PageInfo& info = found->second; |
| 222 if (info.has_body()) { | 222 if (info.has_body()) { |
| 223 // This info is complete, write to the database. | 223 // This info is complete, write to the database. |
| 224 AddPageData(url, info.url_id(), info.visit_id(), info.visit_time(), | 224 AddPageData(url, info.url_id(), info.visit_id(), info.visit_time(), |
| 225 title, info.body()); | 225 title, info.body()); |
| 226 recent_changes_.Erase(found); | 226 recent_changes_.Erase(found); |
| 227 return; | 227 return; |
| 228 } | 228 } |
| 229 | 229 |
| 230 info.set_title(title); | 230 info.set_title(title); |
| 231 } | 231 } |
| 232 | 232 |
| 233 void TextDatabaseManager::AddPageContents(const GURL& url, | 233 void TextDatabaseManager::AddPageContents(const GURL& url, |
| 234 const string16& body) { | 234 const string16& body) { |
| 235 RecentChangeList::iterator found = recent_changes_.Peek(url); | 235 RecentChangeList::iterator found = recent_changes_.Peek(url); |
| 236 if (found == recent_changes_.end()) { | 236 if (found == recent_changes_.end()) { |
| 237 // This page is not in our cache of recent pages. This means that the page | 237 // This page is not in our cache of recent pages. This means that the page |
| 238 // took more than kExpirationSec to load. Often, this will be the result of | 238 // took more than kExpirationSeconds to load. Often, this will be the result |
| 239 // a very slow iframe or other resource on the page that makes us think its | 239 // of a very slow iframe or other resource on the page that makes us think |
| 240 // still loading. | 240 // its still loading. |
| 241 // | 241 // |
| 242 // As a fallback, set the most recent visit's contents using the input, and | 242 // As a fallback, set the most recent visit's contents using the input, and |
| 243 // use the last set title in the URL table as the title to index. | 243 // use the last set title in the URL table as the title to index. |
| 244 URLRow url_row; | 244 URLRow url_row; |
| 245 if (!url_database_->GetRowForURL(url, &url_row)) | 245 if (!url_database_->GetRowForURL(url, &url_row)) |
| 246 return; // URL is unknown, give up. | 246 return; // URL is unknown, give up. |
| 247 VisitRow visit; | 247 VisitRow visit; |
| 248 if (!visit_database_->GetMostRecentVisitForURL(url_row.id(), &visit)) | 248 if (!visit_database_->GetMostRecentVisitForURL(url_row.id(), &visit)) |
| 249 return; // No recent visit, give up. | 249 return; // No recent visit, give up. |
| 250 | 250 |
| (...skipping 280 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 531 bool create_if_necessary) { | 531 bool create_if_necessary) { |
| 532 return GetDB(TimeToID(time), create_if_necessary); | 532 return GetDB(TimeToID(time), create_if_necessary); |
| 533 } | 533 } |
| 534 | 534 |
| 535 void TextDatabaseManager::ScheduleFlushOldChanges() { | 535 void TextDatabaseManager::ScheduleFlushOldChanges() { |
| 536 weak_factory_.InvalidateWeakPtrs(); | 536 weak_factory_.InvalidateWeakPtrs(); |
| 537 MessageLoop::current()->PostDelayedTask( | 537 MessageLoop::current()->PostDelayedTask( |
| 538 FROM_HERE, | 538 FROM_HERE, |
| 539 base::Bind(&TextDatabaseManager::FlushOldChanges, | 539 base::Bind(&TextDatabaseManager::FlushOldChanges, |
| 540 weak_factory_.GetWeakPtr()), | 540 weak_factory_.GetWeakPtr()), |
| 541 kExpirationSec * Time::kMillisecondsPerSecond); | 541 base::TimeDelta::FromSeconds(kExpirationSeconds)); |
| 542 } | 542 } |
| 543 | 543 |
| 544 void TextDatabaseManager::FlushOldChanges() { | 544 void TextDatabaseManager::FlushOldChanges() { |
| 545 FlushOldChangesForTime(TimeTicks::Now()); | 545 FlushOldChangesForTime(TimeTicks::Now()); |
| 546 } | 546 } |
| 547 | 547 |
| 548 void TextDatabaseManager::FlushOldChangesForTime(TimeTicks now) { | 548 void TextDatabaseManager::FlushOldChangesForTime(TimeTicks now) { |
| 549 // The end of the list is the oldest, so we just start from there committing | 549 // The end of the list is the oldest, so we just start from there committing |
| 550 // things until we get something too new. | 550 // things until we get something too new. |
| 551 RecentChangeList::reverse_iterator i = recent_changes_.rbegin(); | 551 RecentChangeList::reverse_iterator i = recent_changes_.rbegin(); |
| 552 while (i != recent_changes_.rend() && i->second.Expired(now)) { | 552 while (i != recent_changes_.rend() && i->second.Expired(now)) { |
| 553 AddPageData(i->first, i->second.url_id(), i->second.visit_id(), | 553 AddPageData(i->first, i->second.url_id(), i->second.visit_id(), |
| 554 i->second.visit_time(), i->second.title(), i->second.body()); | 554 i->second.visit_time(), i->second.title(), i->second.body()); |
| 555 i = recent_changes_.Erase(i); | 555 i = recent_changes_.Erase(i); |
| 556 } | 556 } |
| 557 | 557 |
| 558 ScheduleFlushOldChanges(); | 558 ScheduleFlushOldChanges(); |
| 559 } | 559 } |
| 560 | 560 |
| 561 } // namespace history | 561 } // namespace history |
| OLD | NEW |