| 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 0b51142f416a4d913ad840da1d3b95aa4bacec93..4cec340493122651f5e99ae7305a898c80367ed8 100644
|
| --- a/components/offline_pages/background/request_queue_store_sql.cc
|
| +++ b/components/offline_pages/background/request_queue_store_sql.cc
|
| @@ -135,16 +135,22 @@ RequestQueue::UpdateRequestResult DeleteRequestById(sql::Connection* db,
|
| return RequestQueue::UpdateRequestResult::SUCCESS;
|
| }
|
|
|
| -bool ChangeRequestState(sql::Connection* db,
|
| - const int64_t request_id,
|
| - const SavePageRequest::RequestState new_state) {
|
| +ItemActionStatus ChangeRequestState(
|
| + sql::Connection* db,
|
| + const int64_t request_id,
|
| + const SavePageRequest::RequestState new_state) {
|
| const char kSql[] = "UPDATE " REQUEST_QUEUE_TABLE_NAME
|
| " SET state=?"
|
| " WHERE request_id=?";
|
| sql::Statement statement(db->GetCachedStatement(SQL_FROM_HERE, kSql));
|
| statement.BindInt64(0, static_cast<int64_t>(new_state));
|
| statement.BindInt64(1, request_id);
|
| - return statement.Run();
|
| +
|
| + if (!statement.Run())
|
| + return ItemActionStatus::STORE_ERROR;
|
| + if (db->GetLastChangeCount() == 0)
|
| + return ItemActionStatus::NOT_FOUND;
|
| + return ItemActionStatus::SUCCESS;
|
| }
|
|
|
| // Helper function to delete requests corresponding to passed in requestIds,
|
| @@ -182,43 +188,6 @@ bool DeleteRequestsByIds(
|
| return true;
|
| }
|
|
|
| -bool ChangeRequestsState(
|
| - sql::Connection* db,
|
| - const std::vector<int64_t>& request_ids,
|
| - SavePageRequest::RequestState new_state,
|
| - 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;
|
| - }
|
| -
|
| - // Update a request, then get it, and put the item we got on the output list.
|
| - for (const auto& request_id : request_ids) {
|
| - RequestQueue::UpdateRequestResult status;
|
| - if (!ChangeRequestState(db, request_id, new_state))
|
| - status = RequestQueue::UpdateRequestResult::REQUEST_DOES_NOT_EXIST;
|
| - else
|
| - status = RequestQueue::UpdateRequestResult::SUCCESS;
|
| -
|
| - // Make output request_id/status pair, and put a copy of the updated request
|
| - // on output list.
|
| - results.push_back(std::make_pair(request_id, status));
|
| - requests.push_back(GetOneRequest(db, request_id));
|
| - }
|
| -
|
| - if (!transaction.Commit()) {
|
| - requests.clear();
|
| - BuildFailedResultList(request_ids, results);
|
| - return false;
|
| - }
|
| -
|
| - return true;
|
| -}
|
| -
|
| ItemActionStatus Insert(sql::Connection* db, const SavePageRequest& request) {
|
| const char kSql[] =
|
| "INSERT OR IGNORE INTO " REQUEST_QUEUE_TABLE_NAME
|
| @@ -298,6 +267,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);
|
| @@ -314,6 +291,20 @@ bool InitDatabase(sql::Connection* db, const base::FilePath& path) {
|
| return CreateSchema(db);
|
| }
|
|
|
| +std::unique_ptr<SavePageRequest> GetRequestByIdSync(sql::Connection* db,
|
| + int64_t item_id) {
|
| + const char kSql[] =
|
| + "SELECT * FROM " REQUEST_QUEUE_TABLE_NAME " WHERE request_id = ?";
|
| + sql::Statement statement(db->GetCachedStatement(SQL_FROM_HERE, kSql));
|
| + statement.BindInt64(0, item_id);
|
| +
|
| + if (statement.Step()) {
|
| + return MakeSavePageRequest(statement);
|
| + }
|
| +
|
| + return std::unique_ptr<SavePageRequest>(nullptr);
|
| +}
|
| +
|
| void GetRequestsSync(sql::Connection* db,
|
| scoped_refptr<base::SingleThreadTaskRunner> runner,
|
| const RequestQueueStore::GetRequestsCallback& callback) {
|
| @@ -384,19 +375,44 @@ void RemoveRequestsSync(sql::Connection* db,
|
| base::Bind(callback, results, base::Passed(&requests)));
|
| }
|
|
|
| +// TODO(fgorski): This method is to be completely removed by petewil's patch.
|
| void ChangeRequestsStateSync(
|
| sql::Connection* db,
|
| scoped_refptr<base::SingleThreadTaskRunner> runner,
|
| const std::vector<int64_t>& request_ids,
|
| const SavePageRequest::RequestState new_state,
|
| - const RequestQueue::UpdateMultipleRequestsCallback& callback) {
|
| - RequestQueue::UpdateMultipleRequestResults results;
|
| - std::vector<std::unique_ptr<SavePageRequest>> requests;
|
| + const RequestQueueStore::UpdateCallback& callback) {
|
| // TODO(fgorski): add UMA metrics here.
|
| - offline_pages::ChangeRequestsState(db, request_ids, new_state, results,
|
| - requests);
|
| - runner->PostTask(FROM_HERE,
|
| - base::Bind(callback, results, base::Passed(&requests)));
|
| + std::unique_ptr<UpdateRequestsResult> result(
|
| + new UpdateRequestsResult(StoreState::LOADED));
|
| +
|
| + sql::Transaction transaction(db);
|
| + if (!transaction.Begin()) {
|
| + PostStoreErrorForAllIds(runner, request_ids, callback);
|
| + return;
|
| + }
|
| +
|
| + // Update a request, then get it, and put the item we got on the output list.
|
| + for (const auto& request_id : request_ids) {
|
| + ItemActionStatus status = ChangeRequestState(db, request_id, new_state);
|
| + if (status == ItemActionStatus::SUCCESS) {
|
| + std::unique_ptr<SavePageRequest> request =
|
| + GetRequestByIdSync(db, request_id);
|
| + if (request.get())
|
| + result->updated_items.push_back(*request);
|
| + else
|
| + status = ItemActionStatus::STORE_ERROR;
|
| + }
|
| +
|
| + result->item_statuses.push_back(std::make_pair(request_id, status));
|
| + }
|
| +
|
| + if (!transaction.Commit()) {
|
| + PostStoreErrorForAllIds(runner, request_ids, callback);
|
| + return;
|
| + }
|
| +
|
| + runner->PostTask(FROM_HERE, base::Bind(callback, base::Passed(&result)));
|
| }
|
|
|
| void OpenConnectionSync(sql::Connection* db,
|
| @@ -509,10 +525,10 @@ void RequestQueueStoreSQL::RemoveRequests(
|
| void RequestQueueStoreSQL::ChangeRequestsState(
|
| const std::vector<int64_t>& request_ids,
|
| const SavePageRequest::RequestState new_state,
|
| - const UpdateMultipleRequestsCallback& callback) {
|
| - RequestQueue::UpdateMultipleRequestResults results;
|
| - std::vector<std::unique_ptr<SavePageRequest>> requests;
|
| - if (!CheckDb(base::Bind(callback, results, base::Passed(&requests)))) {
|
| + const UpdateCallback& callback) {
|
| + if (!db_.get()) {
|
| + PostStoreErrorForAllIds(base::ThreadTaskRunnerHandle::Get(), request_ids,
|
| + callback);
|
| return;
|
| }
|
|
|
|
|