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

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

Issue 2373933003: [Offline pages] Updating RequestQueue::RemoveRequests to use a TaskQueue (Closed)
Patch Set: Addressing final feedback Created 4 years, 2 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 df016289fb7db2ce4b16e0f48710c6e1d36d6c02..f88872be361b2960580f1682d6668b23844ade69 100644
--- a/components/offline_pages/background/request_queue_store_sql.cc
+++ b/components/offline_pages/background/request_queue_store_sql.cc
@@ -113,62 +113,16 @@ std::unique_ptr<SavePageRequest> GetOneRequest(sql::Connection* db,
return MakeSavePageRequest(statement);
}
-void BuildFailedResultList(const std::vector<int64_t>& request_ids,
- RequestQueue::UpdateMultipleRequestResults results) {
- results.clear();
- for (int64_t request_id : request_ids) {
- results.push_back(std::make_pair(
- request_id, RequestQueue::UpdateRequestResult::STORE_FAILURE));
- }
-}
-
-RequestQueue::UpdateRequestResult DeleteRequestById(sql::Connection* db,
- int64_t request_id) {
+ItemActionStatus DeleteRequestById(sql::Connection* db, int64_t request_id) {
const char kSql[] =
"DELETE FROM " REQUEST_QUEUE_TABLE_NAME " WHERE request_id=?";
sql::Statement statement(db->GetCachedStatement(SQL_FROM_HERE, kSql));
statement.BindInt64(0, request_id);
if (!statement.Run())
- return RequestQueue::UpdateRequestResult::STORE_FAILURE;
+ return ItemActionStatus::STORE_ERROR;
else if (db->GetLastChangeCount() == 0)
- return RequestQueue::UpdateRequestResult::REQUEST_DOES_NOT_EXIST;
- else
- return RequestQueue::UpdateRequestResult::SUCCESS;
-}
-
-// Helper function to delete requests corresponding to passed in requestIds,
-// and fill an outparam with the removed requests.
-bool DeleteRequestsByIds(
- sql::Connection* db,
- const std::vector<int64_t>& request_ids,
- RequestQueue::UpdateMultipleRequestResults& results,
- std::vector<std::unique_ptr<SavePageRequest>>* requests) {
- // 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()) {
- BuildFailedResultList(request_ids, results);
- return false;
- }
-
- // Read the request before we delete it, and if the delete worked, put it on
- // the queue of requests that got deleted.
- for (int64_t request_id : request_ids) {
- std::unique_ptr<SavePageRequest> request = GetOneRequest(db, request_id);
- RequestQueue::UpdateRequestResult result =
- DeleteRequestById(db, request_id);
- results.push_back(std::make_pair(request_id, result));
- if (result == RequestQueue::UpdateRequestResult::SUCCESS)
- requests->push_back(std::move(request));
- }
-
- if (!transaction.Commit()) {
- requests->clear();
- BuildFailedResultList(request_ids, results);
- return false;
- }
-
- return true;
+ return ItemActionStatus::NOT_FOUND;
+ return ItemActionStatus::SUCCESS;
}
ItemActionStatus Insert(sql::Connection* db, const SavePageRequest& request) {
@@ -250,6 +204,14 @@ void PostStoreErrorForAllRequests(
ItemActionStatus::STORE_ERROR, callback);
}
+void PostStoreErrorForAllIds(
+ scoped_refptr<base::SingleThreadTaskRunner> runner,
+ const std::vector<int64_t>& item_ids,
+ const RequestQueueStore::UpdateCallback& callback) {
+ PostStoreUpdateResultForIds(runner, StoreState::LOADED, item_ids,
+ ItemActionStatus::STORE_ERROR, callback);
+}
+
bool InitDatabase(sql::Connection* db, const base::FilePath& path) {
db->set_page_size(4096);
db->set_cache_size(500);
@@ -327,13 +289,35 @@ void UpdateRequestsSync(sql::Connection* db,
void RemoveRequestsSync(sql::Connection* db,
scoped_refptr<base::SingleThreadTaskRunner> runner,
const std::vector<int64_t>& request_ids,
- const RequestQueueStore::RemoveCallback& callback) {
- RequestQueue::UpdateMultipleRequestResults results;
- std::vector<std::unique_ptr<SavePageRequest>> requests;
- // TODO(fgorski): add UMA metrics here.
- DeleteRequestsByIds(db, request_ids, results, &requests);
- runner->PostTask(FROM_HERE,
- base::Bind(callback, results, base::Passed(&requests)));
+ const RequestQueueStore::UpdateCallback& callback) {
+ // TODO(fgorski): Perhaps add metrics here.
+ std::unique_ptr<UpdateRequestsResult> result(
+ new UpdateRequestsResult(StoreState::LOADED));
+
+ // 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()) {
+ PostStoreErrorForAllIds(runner, request_ids, callback);
+ return;
+ }
+
+ // Read the request before we delete it, and if the delete worked, put it on
+ // the queue of requests that got deleted.
+ for (int64_t request_id : request_ids) {
+ std::unique_ptr<SavePageRequest> request = GetOneRequest(db, request_id);
+ ItemActionStatus status = DeleteRequestById(db, request_id);
+ result->item_statuses.push_back(std::make_pair(request_id, status));
+ if (status == ItemActionStatus::SUCCESS)
+ result->updated_items.push_back(*request);
+ }
+
+ if (!transaction.Commit()) {
+ PostStoreErrorForAllIds(runner, request_ids, callback);
+ return;
+ }
+
+ runner->PostTask(FROM_HERE, base::Bind(callback, base::Passed(&result)));
}
void OpenConnectionSync(sql::Connection* db,
@@ -429,17 +413,10 @@ void RequestQueueStoreSQL::UpdateRequests(
void RequestQueueStoreSQL::RemoveRequests(
const std::vector<int64_t>& request_ids,
- const RemoveCallback& callback) {
- // Set up a failed set of results in case we fail the DB check.
- RequestQueue::UpdateMultipleRequestResults results;
- for (int64_t request_id : request_ids) {
- results.push_back(std::make_pair(
- request_id, RequestQueue::UpdateRequestResult::STORE_FAILURE));
- }
-
- if (!CheckDb(base::Bind(
- callback, results,
- base::Passed(std::vector<std::unique_ptr<SavePageRequest>>())))) {
+ const UpdateCallback& callback) {
+ if (!db_.get()) {
+ PostStoreErrorForAllIds(base::ThreadTaskRunnerHandle::Get(), request_ids,
+ callback);
return;
}

Powered by Google App Engine
This is Rietveld 408576698