Index: chrome/browser/extensions/activity_log/counting_policy.cc |
diff --git a/chrome/browser/extensions/activity_log/counting_policy.cc b/chrome/browser/extensions/activity_log/counting_policy.cc |
index 72e66bb0ba7f3cbf8809f4c478810cca65d0f96c..9188b48ad8bd2b69543ae0f190ed5e9a7c60b324 100644 |
--- a/chrome/browser/extensions/activity_log/counting_policy.cc |
+++ b/chrome/browser/extensions/activity_log/counting_policy.cc |
@@ -567,6 +567,78 @@ scoped_ptr<Action::ActionVector> CountingPolicy::DoReadData( |
return actions.Pass(); |
} |
+void CountingPolicy::DoRemoveURLs(const std::vector<GURL>& restrict_urls) { |
+ sql::Connection* db = GetDatabaseConnection(); |
+ if (!db) { |
+ LOG(ERROR) << "Unable to connect to database"; |
+ return; |
+ } |
+ |
+ // Flush data first so the URL clearing affects queued-up data as well. |
+ activity_database()->AdviseFlush(ActivityDatabase::kFlushImmediately); |
+ |
+ // If no restrictions then then all URLs need to be removed. |
+ if (restrict_urls.empty()) { |
+ std::string sql_str = base::StringPrintf( |
+ "UPDATE %s SET page_url_x=NULL,page_title_x=NULL,arg_url_x=NULL", |
+ kTableName); |
+ |
+ sql::Statement statement; |
+ statement.Assign(db->GetCachedStatement( |
+ sql::StatementID(SQL_FROM_HERE), sql_str.c_str())); |
+ |
+ if (!statement.Run()) { |
+ LOG(ERROR) << "Removing all URLs from database failed: " |
+ << statement.GetSQLStatement(); |
+ return; |
+ } |
+ } |
+ |
+ // If URLs are specified then restrict to only those URLs. |
+ for (size_t i = 0; i < restrict_urls.size(); ++i) { |
+ int64 url_id; |
+ if (!restrict_urls[i].is_valid() || |
+ !url_table_.StringToInt(db, restrict_urls[i].spec(), &url_id)) { |
+ continue; |
+ } |
+ |
+ // Remove any that match the page_url. |
+ std::string sql_str = base::StringPrintf( |
+ "UPDATE %s SET page_url_x=NULL,page_title_x=NULL WHERE page_url_x IS ?", |
+ kTableName); |
+ |
+ sql::Statement statement; |
+ statement.Assign(db->GetCachedStatement( |
+ sql::StatementID(SQL_FROM_HERE), sql_str.c_str())); |
+ statement.BindInt64(0, url_id); |
+ |
+ if (!statement.Run()) { |
+ LOG(ERROR) << "Removing page URL from database failed: " |
+ << statement.GetSQLStatement(); |
+ return; |
+ } |
+ |
+ // Remove any that match the arg_url. |
+ sql_str = base::StringPrintf( |
+ "UPDATE %s SET arg_url_x=NULL WHERE arg_url_x IS ?", kTableName); |
+ |
+ statement.Assign(db->GetCachedStatement( |
+ sql::StatementID(SQL_FROM_HERE), sql_str.c_str())); |
+ statement.BindInt64(0, url_id); |
+ |
+ if (!statement.Run()) { |
+ LOG(ERROR) << "Removing arg URL from database failed: " |
+ << statement.GetSQLStatement(); |
+ return; |
+ } |
+ } |
+ |
+ // Clean up unused strings from the strings and urls table to really delete |
+ // the urls and page titles. Should be called even if an error occured when |
+ // removing a URL as there may some things to clean up. |
+ CleanStringTables(db); |
+} |
+ |
void CountingPolicy::ReadData( |
const std::string& extension_id, |
const int day, |
@@ -602,6 +674,10 @@ void CountingPolicy::ReadFilteredData( |
callback); |
} |
+void CountingPolicy::RemoveURLs(const std::vector<GURL>& restrict_urls) { |
+ ScheduleAndForget(this, &CountingPolicy::DoRemoveURLs, restrict_urls); |
+} |
+ |
void CountingPolicy::OnDatabaseFailure() { |
queued_actions_.clear(); |
} |