| OLD | NEW |
| 1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "components/offline_pages/background/request_queue_store_sql.h" | 5 #include "components/offline_pages/background/request_queue_store_sql.h" |
| 6 | 6 |
| 7 #include "base/bind.h" | 7 #include "base/bind.h" |
| 8 #include "base/files/file_path.h" | 8 #include "base/files/file_path.h" |
| 9 #include "base/files/file_util.h" | 9 #include "base/files/file_util.h" |
| 10 #include "base/location.h" | 10 #include "base/location.h" |
| (...skipping 117 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 128 sql::Statement statement(db->GetCachedStatement(SQL_FROM_HERE, kSql)); | 128 sql::Statement statement(db->GetCachedStatement(SQL_FROM_HERE, kSql)); |
| 129 statement.BindInt64(0, request_id); | 129 statement.BindInt64(0, request_id); |
| 130 if (!statement.Run()) | 130 if (!statement.Run()) |
| 131 return RequestQueue::UpdateRequestResult::STORE_FAILURE; | 131 return RequestQueue::UpdateRequestResult::STORE_FAILURE; |
| 132 else if (db->GetLastChangeCount() == 0) | 132 else if (db->GetLastChangeCount() == 0) |
| 133 return RequestQueue::UpdateRequestResult::REQUEST_DOES_NOT_EXIST; | 133 return RequestQueue::UpdateRequestResult::REQUEST_DOES_NOT_EXIST; |
| 134 else | 134 else |
| 135 return RequestQueue::UpdateRequestResult::SUCCESS; | 135 return RequestQueue::UpdateRequestResult::SUCCESS; |
| 136 } | 136 } |
| 137 | 137 |
| 138 bool ChangeRequestState(sql::Connection* db, | |
| 139 const int64_t request_id, | |
| 140 const SavePageRequest::RequestState new_state) { | |
| 141 const char kSql[] = "UPDATE " REQUEST_QUEUE_TABLE_NAME | |
| 142 " SET state=?" | |
| 143 " WHERE request_id=?"; | |
| 144 sql::Statement statement(db->GetCachedStatement(SQL_FROM_HERE, kSql)); | |
| 145 statement.BindInt64(0, static_cast<int64_t>(new_state)); | |
| 146 statement.BindInt64(1, request_id); | |
| 147 return statement.Run(); | |
| 148 } | |
| 149 | |
| 150 // Helper function to delete requests corresponding to passed in requestIds, | 138 // Helper function to delete requests corresponding to passed in requestIds, |
| 151 // and fill an outparam with the removed requests. | 139 // and fill an outparam with the removed requests. |
| 152 bool DeleteRequestsByIds( | 140 bool DeleteRequestsByIds( |
| 153 sql::Connection* db, | 141 sql::Connection* db, |
| 154 const std::vector<int64_t>& request_ids, | 142 const std::vector<int64_t>& request_ids, |
| 155 RequestQueue::UpdateMultipleRequestResults& results, | 143 RequestQueue::UpdateMultipleRequestResults& results, |
| 156 std::vector<std::unique_ptr<SavePageRequest>>* requests) { | 144 std::vector<std::unique_ptr<SavePageRequest>>* requests) { |
| 157 // If you create a transaction but don't Commit() it is automatically | 145 // If you create a transaction but don't Commit() it is automatically |
| 158 // rolled back by its destructor when it falls out of scope. | 146 // rolled back by its destructor when it falls out of scope. |
| 159 sql::Transaction transaction(db); | 147 sql::Transaction transaction(db); |
| (...skipping 15 matching lines...) Expand all Loading... |
| 175 | 163 |
| 176 if (!transaction.Commit()) { | 164 if (!transaction.Commit()) { |
| 177 requests->clear(); | 165 requests->clear(); |
| 178 BuildFailedResultList(request_ids, results); | 166 BuildFailedResultList(request_ids, results); |
| 179 return false; | 167 return false; |
| 180 } | 168 } |
| 181 | 169 |
| 182 return true; | 170 return true; |
| 183 } | 171 } |
| 184 | 172 |
| 185 bool ChangeRequestsState( | |
| 186 sql::Connection* db, | |
| 187 const std::vector<int64_t>& request_ids, | |
| 188 SavePageRequest::RequestState new_state, | |
| 189 RequestQueue::UpdateMultipleRequestResults& results, | |
| 190 std::vector<std::unique_ptr<SavePageRequest>>& requests) { | |
| 191 // If you create a transaction but don't Commit() it is automatically | |
| 192 // rolled back by its destructor when it falls out of scope. | |
| 193 sql::Transaction transaction(db); | |
| 194 if (!transaction.Begin()) { | |
| 195 BuildFailedResultList(request_ids, results); | |
| 196 return false; | |
| 197 } | |
| 198 | |
| 199 // Update a request, then get it, and put the item we got on the output list. | |
| 200 for (const auto& request_id : request_ids) { | |
| 201 RequestQueue::UpdateRequestResult status; | |
| 202 if (!ChangeRequestState(db, request_id, new_state)) | |
| 203 status = RequestQueue::UpdateRequestResult::REQUEST_DOES_NOT_EXIST; | |
| 204 else | |
| 205 status = RequestQueue::UpdateRequestResult::SUCCESS; | |
| 206 | |
| 207 // Make output request_id/status pair, and put a copy of the updated request | |
| 208 // on output list. | |
| 209 results.push_back(std::make_pair(request_id, status)); | |
| 210 requests.push_back(GetOneRequest(db, request_id)); | |
| 211 } | |
| 212 | |
| 213 if (!transaction.Commit()) { | |
| 214 requests.clear(); | |
| 215 BuildFailedResultList(request_ids, results); | |
| 216 return false; | |
| 217 } | |
| 218 | |
| 219 return true; | |
| 220 } | |
| 221 | |
| 222 ItemActionStatus Insert(sql::Connection* db, const SavePageRequest& request) { | 173 ItemActionStatus Insert(sql::Connection* db, const SavePageRequest& request) { |
| 223 const char kSql[] = | 174 const char kSql[] = |
| 224 "INSERT OR IGNORE INTO " REQUEST_QUEUE_TABLE_NAME | 175 "INSERT OR IGNORE INTO " REQUEST_QUEUE_TABLE_NAME |
| 225 " (request_id, creation_time, activation_time," | 176 " (request_id, creation_time, activation_time," |
| 226 " last_attempt_time, started_attempt_count, completed_attempt_count," | 177 " last_attempt_time, started_attempt_count, completed_attempt_count," |
| 227 " state, url, client_namespace, client_id)" | 178 " state, url, client_namespace, client_id)" |
| 228 " VALUES " | 179 " VALUES " |
| 229 " (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)"; | 180 " (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)"; |
| 230 | 181 |
| 231 sql::Statement statement(db->GetCachedStatement(SQL_FROM_HERE, kSql)); | 182 sql::Statement statement(db->GetCachedStatement(SQL_FROM_HERE, kSql)); |
| (...skipping 145 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 377 const std::vector<int64_t>& request_ids, | 328 const std::vector<int64_t>& request_ids, |
| 378 const RequestQueueStore::RemoveCallback& callback) { | 329 const RequestQueueStore::RemoveCallback& callback) { |
| 379 RequestQueue::UpdateMultipleRequestResults results; | 330 RequestQueue::UpdateMultipleRequestResults results; |
| 380 std::vector<std::unique_ptr<SavePageRequest>> requests; | 331 std::vector<std::unique_ptr<SavePageRequest>> requests; |
| 381 // TODO(fgorski): add UMA metrics here. | 332 // TODO(fgorski): add UMA metrics here. |
| 382 DeleteRequestsByIds(db, request_ids, results, &requests); | 333 DeleteRequestsByIds(db, request_ids, results, &requests); |
| 383 runner->PostTask(FROM_HERE, | 334 runner->PostTask(FROM_HERE, |
| 384 base::Bind(callback, results, base::Passed(&requests))); | 335 base::Bind(callback, results, base::Passed(&requests))); |
| 385 } | 336 } |
| 386 | 337 |
| 387 void ChangeRequestsStateSync( | |
| 388 sql::Connection* db, | |
| 389 scoped_refptr<base::SingleThreadTaskRunner> runner, | |
| 390 const std::vector<int64_t>& request_ids, | |
| 391 const SavePageRequest::RequestState new_state, | |
| 392 const RequestQueue::UpdateMultipleRequestsCallback& callback) { | |
| 393 RequestQueue::UpdateMultipleRequestResults results; | |
| 394 std::vector<std::unique_ptr<SavePageRequest>> requests; | |
| 395 // TODO(fgorski): add UMA metrics here. | |
| 396 offline_pages::ChangeRequestsState(db, request_ids, new_state, results, | |
| 397 requests); | |
| 398 runner->PostTask(FROM_HERE, | |
| 399 base::Bind(callback, results, base::Passed(&requests))); | |
| 400 } | |
| 401 | |
| 402 void OpenConnectionSync(sql::Connection* db, | 338 void OpenConnectionSync(sql::Connection* db, |
| 403 scoped_refptr<base::SingleThreadTaskRunner> runner, | 339 scoped_refptr<base::SingleThreadTaskRunner> runner, |
| 404 const base::FilePath& path, | 340 const base::FilePath& path, |
| 405 const base::Callback<void(bool)>& callback) { | 341 const base::Callback<void(bool)>& callback) { |
| 406 bool success = InitDatabase(db, path); | 342 bool success = InitDatabase(db, path); |
| 407 runner->PostTask(FROM_HERE, base::Bind(callback, success)); | 343 runner->PostTask(FROM_HERE, base::Bind(callback, success)); |
| 408 } | 344 } |
| 409 | 345 |
| 410 void ResetSync(sql::Connection* db, | 346 void ResetSync(sql::Connection* db, |
| 411 const base::FilePath& db_file_path, | 347 const base::FilePath& db_file_path, |
| (...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 498 base::Passed(std::vector<std::unique_ptr<SavePageRequest>>())))) { | 434 base::Passed(std::vector<std::unique_ptr<SavePageRequest>>())))) { |
| 499 return; | 435 return; |
| 500 } | 436 } |
| 501 | 437 |
| 502 background_task_runner_->PostTask( | 438 background_task_runner_->PostTask( |
| 503 FROM_HERE, | 439 FROM_HERE, |
| 504 base::Bind(&RemoveRequestsSync, db_.get(), | 440 base::Bind(&RemoveRequestsSync, db_.get(), |
| 505 base::ThreadTaskRunnerHandle::Get(), request_ids, callback)); | 441 base::ThreadTaskRunnerHandle::Get(), request_ids, callback)); |
| 506 } | 442 } |
| 507 | 443 |
| 508 void RequestQueueStoreSQL::ChangeRequestsState( | |
| 509 const std::vector<int64_t>& request_ids, | |
| 510 const SavePageRequest::RequestState new_state, | |
| 511 const UpdateMultipleRequestsCallback& callback) { | |
| 512 RequestQueue::UpdateMultipleRequestResults results; | |
| 513 std::vector<std::unique_ptr<SavePageRequest>> requests; | |
| 514 if (!CheckDb(base::Bind(callback, results, base::Passed(&requests)))) { | |
| 515 return; | |
| 516 } | |
| 517 | |
| 518 background_task_runner_->PostTask( | |
| 519 FROM_HERE, base::Bind(&ChangeRequestsStateSync, db_.get(), | |
| 520 base::ThreadTaskRunnerHandle::Get(), request_ids, | |
| 521 new_state, callback)); | |
| 522 } | |
| 523 | |
| 524 void RequestQueueStoreSQL::Reset(const ResetCallback& callback) { | 444 void RequestQueueStoreSQL::Reset(const ResetCallback& callback) { |
| 525 DCHECK(db_.get()); | 445 DCHECK(db_.get()); |
| 526 if (!CheckDb(base::Bind(callback, false))) | 446 if (!CheckDb(base::Bind(callback, false))) |
| 527 return; | 447 return; |
| 528 | 448 |
| 529 background_task_runner_->PostTask( | 449 background_task_runner_->PostTask( |
| 530 FROM_HERE, | 450 FROM_HERE, |
| 531 base::Bind(&ResetSync, db_.get(), db_file_path_, | 451 base::Bind(&ResetSync, db_.get(), db_file_path_, |
| 532 base::ThreadTaskRunnerHandle::Get(), | 452 base::ThreadTaskRunnerHandle::Get(), |
| 533 base::Bind(&RequestQueueStoreSQL::OnResetDone, | 453 base::Bind(&RequestQueueStoreSQL::OnResetDone, |
| (...skipping 20 matching lines...) Expand all Loading... |
| 554 } | 474 } |
| 555 | 475 |
| 556 void RequestQueueStoreSQL::OnResetDone(const ResetCallback& callback, | 476 void RequestQueueStoreSQL::OnResetDone(const ResetCallback& callback, |
| 557 bool success) { | 477 bool success) { |
| 558 // Complete connection initialization post reset. | 478 // Complete connection initialization post reset. |
| 559 OnOpenConnectionDone(success); | 479 OnOpenConnectionDone(success); |
| 560 callback.Run(success); | 480 callback.Run(success); |
| 561 } | 481 } |
| 562 | 482 |
| 563 } // namespace offline_pages | 483 } // namespace offline_pages |
| OLD | NEW |