Index: trunk/src/chrome/browser/history/expire_history_backend.cc |
=================================================================== |
--- trunk/src/chrome/browser/history/expire_history_backend.cc (revision 212472) |
+++ trunk/src/chrome/browser/history/expire_history_backend.cc (working copy) |
@@ -19,6 +19,8 @@ |
#include "chrome/browser/history/archived_database.h" |
#include "chrome/browser/history/history_database.h" |
#include "chrome/browser/history/history_notifications.h" |
+#include "chrome/browser/history/text_database.h" |
+#include "chrome/browser/history/text_database_manager.h" |
#include "chrome/browser/history/thumbnail_database.h" |
using base::Time; |
@@ -170,6 +172,10 @@ |
// The list of all favicon urls that were actually deleted from the thumbnail |
// db. |
std::set<GURL> expired_favicons; |
+ |
+ // Tracks the set of databases that have changed so we can optimize when |
+ // when we're done. |
+ TextDatabaseManager::ChangeSet text_db_changes; |
}; |
ExpireHistoryBackend::ExpireHistoryBackend( |
@@ -179,6 +185,7 @@ |
main_db_(NULL), |
archived_db_(NULL), |
thumb_db_(NULL), |
+ text_db_(NULL), |
weak_factory_(this), |
bookmark_service_(bookmark_service) { |
} |
@@ -188,10 +195,12 @@ |
void ExpireHistoryBackend::SetDatabases(HistoryDatabase* main_db, |
ArchivedDatabase* archived_db, |
- ThumbnailDatabase* thumb_db) { |
+ ThumbnailDatabase* thumb_db, |
+ TextDatabaseManager* text_db) { |
main_db_ = main_db; |
archived_db_ = archived_db; |
thumb_db_ = thumb_db; |
+ text_db_ = text_db; |
} |
void ExpireHistoryBackend::DeleteURL(const GURL& url) { |
@@ -233,6 +242,9 @@ |
DeleteFaviconsIfPossible(dependencies.affected_favicons, |
&dependencies.expired_favicons); |
+ if (text_db_) |
+ text_db_->OptimizeChangedDatabases(dependencies.text_db_changes); |
+ |
BroadcastDeleteNotifications(&dependencies, DELETION_USER_INITIATED); |
} |
@@ -241,6 +253,10 @@ |
if (!main_db_) |
return; |
+ // There may be stuff in the text database manager's temporary cache. |
+ if (text_db_) |
+ text_db_->DeleteFromUncommitted(restrict_urls, begin_time, end_time); |
+ |
// Find the affected visits and delete them. |
// TODO(brettw): bug 1171164: We should query the archived database here, too. |
VisitVector visits; |
@@ -274,6 +290,10 @@ |
if (!main_db_) |
return; |
+ // There may be stuff in the text database manager's temporary cache. |
+ if (text_db_) |
+ text_db_->DeleteFromUncommittedForTimes(times); |
+ |
// Find the affected visits and delete them. |
// TODO(brettw): bug 1171164: We should query the archived database here, too. |
VisitVector visits; |
@@ -348,6 +368,7 @@ |
// Initialize the queue with all tasks for the first set of iterations. |
InitWorkQueue(); |
ScheduleArchive(); |
+ ScheduleExpireHistoryIndexFiles(); |
} |
void ExpireHistoryBackend::DeleteFaviconsIfPossible( |
@@ -401,12 +422,22 @@ |
// Add the URL row to the affected URL list. |
std::map<URLID, URLRow>::const_iterator found = |
dependencies->affected_urls.find(visits[i].url_id); |
+ const URLRow* cur_row = NULL; |
if (found == dependencies->affected_urls.end()) { |
URLRow row; |
if (!main_db_->GetURLRow(visits[i].url_id, &row)) |
continue; |
dependencies->affected_urls[visits[i].url_id] = row; |
+ cur_row = &dependencies->affected_urls[visits[i].url_id]; |
+ } else { |
+ cur_row = &found->second; |
} |
+ |
+ // Delete any associated full-text indexed data. |
+ if (visits[i].is_indexed && text_db_) { |
+ text_db_->DeletePageData(visits[i].visit_time, cur_row->url(), |
+ &dependencies->text_db_changes); |
+ } |
} |
} |
@@ -416,6 +447,13 @@ |
DeleteDependencies* dependencies) { |
main_db_->DeleteSegmentForURL(url_row.id()); |
+ // The URL may be in the text database manager's temporary cache. |
+ if (text_db_) { |
+ std::set<GURL> restrict_urls; |
+ restrict_urls.insert(url_row.url()); |
+ text_db_->DeleteFromUncommitted(restrict_urls, base::Time(), base::Time()); |
+ } |
+ |
if (!is_bookmarked) { |
dependencies->deleted_urls.push_back(url_row); |
@@ -684,6 +722,48 @@ |
// TODO(brettw): Bug 1067331: write this to clean up any errors. |
} |
+void ExpireHistoryBackend::ScheduleExpireHistoryIndexFiles() { |
+ if (!text_db_) { |
+ // Can't expire old history index files because we |
+ // don't know where they're located. |
+ return; |
+ } |
+ |
+ TimeDelta delay = TimeDelta::FromMinutes(kIndexExpirationDelayMin); |
+ base::MessageLoop::current()->PostDelayedTask( |
+ FROM_HERE, |
+ base::Bind(&ExpireHistoryBackend::DoExpireHistoryIndexFiles, |
+ weak_factory_.GetWeakPtr()), |
+ delay); |
+} |
+ |
+void ExpireHistoryBackend::DoExpireHistoryIndexFiles() { |
+ if (!text_db_) { |
+ // The text database may have been closed since the task was scheduled. |
+ return; |
+ } |
+ |
+ Time::Exploded exploded; |
+ Time::Now().LocalExplode(&exploded); |
+ int cutoff_month = |
+ exploded.year * 12 + exploded.month - kStoreHistoryIndexesForMonths; |
+ TextDatabase::DBIdent cutoff_id = |
+ (cutoff_month / 12) * 100 + (cutoff_month % 12); |
+ |
+ base::FilePath::StringType history_index_files_pattern = |
+ TextDatabase::file_base(); |
+ history_index_files_pattern.append(FILE_PATH_LITERAL("*")); |
+ base::FileEnumerator file_enumerator( |
+ text_db_->GetDir(), false, base::FileEnumerator::FILES, |
+ history_index_files_pattern); |
+ for (base::FilePath file = file_enumerator.Next(); !file.empty(); |
+ file = file_enumerator.Next()) { |
+ TextDatabase::DBIdent file_id = TextDatabase::FileNameToID(file); |
+ if (file_id < cutoff_id) |
+ sql::Connection::Delete(file); |
+ } |
+} |
+ |
BookmarkService* ExpireHistoryBackend::GetBookmarkService() { |
// We use the bookmark service to determine if a URL is bookmarked. The |
// bookmark service is loaded on a separate thread and may not be done by the |