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

Unified Diff: components/offline_pages/background/request_queue_store_sql.cc

Issue 2197573003: Provide API in RequestCoordinator to remove results by client ID. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Comment changes per feedback Created 4 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 side-by-side diff with in-line comments
Download patch
Index: components/offline_pages/background/request_queue_store_sql.cc
diff --git a/components/offline_pages/background/request_queue_store_sql.cc b/components/offline_pages/background/request_queue_store_sql.cc
index a1be28c893cfc63947c4eaef29bbd604b76ea2f2..b9de0c83ded7e737600bdb2312cd2a937b46e2e0 100644
--- a/components/offline_pages/background/request_queue_store_sql.cc
+++ b/components/offline_pages/background/request_queue_store_sql.cc
@@ -8,6 +8,7 @@
#include "base/files/file_path.h"
#include "base/files/file_util.h"
#include "base/location.h"
+#include "base/logging.h"
#include "base/sequenced_task_runner.h"
#include "base/threading/thread_task_runner_handle.h"
#include "components/offline_pages/background/save_page_request.h"
@@ -55,6 +56,17 @@ bool DeleteRequestById(sql::Connection* db, int64_t request_id) {
return statement.Run();
}
+bool DeleteRequestByClientId(sql::Connection* db, const ClientId& client_id) {
+ const char kSql[] = "DELETE FROM " REQUEST_QUEUE_TABLE_NAME
+ " WHERE client_namespace=? AND client_id=?";
+ sql::Statement statement(db->GetCachedStatement(SQL_FROM_HERE, kSql));
+ statement.BindString(0, client_id.name_space);
+ statement.BindString(1, client_id.id);
+ DVLOG(2) << kSql << " client_namespace " << client_id.name_space
+ << " client_id " << client_id.id;
+ return statement.Run();
+}
+
bool DeleteRequestsByIds(sql::Connection* db,
const std::vector<int64_t>& request_ids,
int* count) {
@@ -78,6 +90,29 @@ bool DeleteRequestsByIds(sql::Connection* db,
return true;
}
+bool DeleteRequestsByClientIds(sql::Connection* db,
+ const std::vector<ClientId>& client_ids,
+ int* count) {
+ DCHECK(count);
+ // If you create a transaction but don't Commit() it is automatically
+ // rolled back by its destructor when it falls out of scope.
+ sql::Transaction transaction(db);
+ if (!transaction.Begin())
+ return false;
+
+ *count = 0;
+ for (const auto& client_id : client_ids) {
+ if (!DeleteRequestByClientId(db, client_id))
+ return false;
+ *count += db->GetLastChangeCount();
+ }
+
+ if (!transaction.Commit())
+ return false;
+
+ return true;
+}
+
// Create a save page request from a SQL result. Expects complete rows with
// all columns present. Columns are in order they are defined in select query
// in |RequestQueueStore::RequestSync| method.
@@ -94,6 +129,11 @@ SavePageRequest MakeSavePageRequest(const sql::Statement& statement) {
const ClientId client_id(statement.ColumnString(6),
statement.ColumnString(7));
+ DVLOG(2) << "making save page request - id " << id << " url " << url
+ << " client_id " << client_id.name_space << "-" << client_id.id
+ << " creation time " << creation_time << " user requested "
+ << kUserRequested;
+
SavePageRequest request(
id, url, client_id, creation_time, activation_time, kUserRequested);
request.set_last_attempt_time(last_attempt_time);
@@ -217,6 +257,20 @@ void RequestQueueStoreSQL::RemoveRequestsSync(
}
// static
+void RequestQueueStoreSQL::RemoveRequestsByClientIdSync(
+ sql::Connection* db,
+ scoped_refptr<base::SingleThreadTaskRunner> runner,
+ const std::vector<ClientId>& client_ids,
+ const RemoveCallback& callback) {
+ // TODO(fgorski): add UMA metrics here.
+ int count = 0;
+ if (DeleteRequestsByClientIds(db, client_ids, &count))
+ runner->PostTask(FROM_HERE, base::Bind(callback, true, count));
+ else
+ runner->PostTask(FROM_HERE, base::Bind(callback, false, 0));
+}
+
+// static
void RequestQueueStoreSQL::ResetSync(
sql::Connection* db,
const base::FilePath& db_file_path,
@@ -262,6 +316,10 @@ void RequestQueueStoreSQL::AddOrUpdateRequest(const SavePageRequest& request,
base::ThreadTaskRunnerHandle::Get(), request, callback));
}
+// TODO(petewil): This is unused, since request_coordinator doesn't keep
+// request_ids, and neither do clients. Plan is to remove this API in a future
+// changelist. If we do discover a need to keep it, name it
+// RemoveRequestsByRequestId to be more parallell with RemoveRequestsByClientId.
void RequestQueueStoreSQL::RemoveRequests(
const std::vector<int64_t>& request_ids,
const RemoveCallback& callback) {
@@ -280,6 +338,24 @@ void RequestQueueStoreSQL::RemoveRequests(
base::ThreadTaskRunnerHandle::Get(), request_ids, callback));
}
+void RequestQueueStoreSQL::RemoveRequestsByClientId(
+ const std::vector<ClientId>& client_ids,
+ const RemoveCallback& callback) {
+ DCHECK(db_.get());
+ if (!db_.get()) {
+ // Nothing to do, but post a callback instead of calling directly
+ // to preserve the async style behavior to prevent bugs.
+ base::ThreadTaskRunnerHandle::Get()->PostTask(
+ FROM_HERE, base::Bind(callback, false, 0));
+ return;
+ }
+
+ background_task_runner_->PostTask(
+ FROM_HERE,
+ base::Bind(&RequestQueueStoreSQL::RemoveRequestsByClientIdSync, db_.get(),
+ base::ThreadTaskRunnerHandle::Get(), client_ids, callback));
+}
+
void RequestQueueStoreSQL::Reset(const ResetCallback& callback) {
DCHECK(db_.get());
if (!db_.get()) {

Powered by Google App Engine
This is Rietveld 408576698