Chromium Code Reviews| 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" |
| 11 #include "base/logging.h" | 11 #include "base/logging.h" |
| 12 #include "base/sequenced_task_runner.h" | 12 #include "base/sequenced_task_runner.h" |
| 13 #include "base/threading/thread_task_runner_handle.h" | 13 #include "base/threading/thread_task_runner_handle.h" |
| 14 #include "components/offline_pages/background/save_page_request.h" | 14 #include "components/offline_pages/background/save_page_request.h" |
| 15 #include "sql/connection.h" | 15 #include "sql/connection.h" |
| 16 #include "sql/statement.h" | 16 #include "sql/statement.h" |
| 17 #include "sql/transaction.h" | 17 #include "sql/transaction.h" |
| 18 | 18 |
| 19 namespace offline_pages { | 19 namespace offline_pages { |
| 20 | 20 |
| 21 namespace { | 21 namespace { |
| 22 | 22 |
| 23 using UpdateStatus = RequestQueueStore::UpdateStatus; | |
| 24 | |
| 23 // This is a macro instead of a const so that | 25 // This is a macro instead of a const so that |
| 24 // it can be used inline in other SQL statements below. | 26 // it can be used inline in other SQL statements below. |
| 25 #define REQUEST_QUEUE_TABLE_NAME "request_queue_v1" | 27 #define REQUEST_QUEUE_TABLE_NAME "request_queue_v1" |
| 26 const bool kUserRequested = true; | 28 const bool kUserRequested = true; |
| 27 | 29 |
| 28 bool CreateRequestQueueTable(sql::Connection* db) { | 30 bool CreateRequestQueueTable(sql::Connection* db) { |
| 29 const char kSql[] = "CREATE TABLE IF NOT EXISTS " REQUEST_QUEUE_TABLE_NAME | 31 const char kSql[] = "CREATE TABLE IF NOT EXISTS " REQUEST_QUEUE_TABLE_NAME |
| 30 " (request_id INTEGER PRIMARY KEY NOT NULL," | 32 " (request_id INTEGER PRIMARY KEY NOT NULL," |
| 31 " creation_time INTEGER NOT NULL," | 33 " creation_time INTEGER NOT NULL," |
| 32 " activation_time INTEGER NOT NULL DEFAULT 0," | 34 " activation_time INTEGER NOT NULL DEFAULT 0," |
| (...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 101 " state, url, client_namespace, client_id" | 103 " state, url, client_namespace, client_id" |
| 102 " FROM " REQUEST_QUEUE_TABLE_NAME " WHERE request_id=?"; | 104 " FROM " REQUEST_QUEUE_TABLE_NAME " WHERE request_id=?"; |
| 103 | 105 |
| 104 sql::Statement statement(db->GetCachedStatement(SQL_FROM_HERE, kSql)); | 106 sql::Statement statement(db->GetCachedStatement(SQL_FROM_HERE, kSql)); |
| 105 statement.BindInt64(0, request_id); | 107 statement.BindInt64(0, request_id); |
| 106 | 108 |
| 107 statement.Run(); | 109 statement.Run(); |
| 108 return MakeSavePageRequest(statement); | 110 return MakeSavePageRequest(statement); |
| 109 } | 111 } |
| 110 | 112 |
| 113 ItemActionStatus Insert(sql::Connection* db, const SavePageRequest& request) { | |
|
Pete Williamson
2016/09/21 00:00:08
Nit - should we place this just above InsertOrRepl
fgorski
2016/09/21 05:07:50
Done. To be honest I am not very fond of the curre
| |
| 114 const char kSql[] = | |
| 115 "INSERT OR IGNORE INTO " REQUEST_QUEUE_TABLE_NAME | |
| 116 " (request_id, creation_time, activation_time," | |
|
Pete Williamson
2016/09/21 00:00:08
I remember DewittJ suggesting in the OfflinePageMo
fgorski
2016/09/21 05:07:50
No, update will have a different form. Please comp
| |
| 117 " last_attempt_time, started_attempt_count, completed_attempt_count," | |
| 118 " state, url, client_namespace, client_id)" | |
| 119 " VALUES " | |
| 120 " (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)"; | |
| 121 | |
| 122 sql::Statement statement(db->GetCachedStatement(SQL_FROM_HERE, kSql)); | |
| 123 statement.BindInt64(0, request.request_id()); | |
| 124 statement.BindInt64(1, request.creation_time().ToInternalValue()); | |
| 125 statement.BindInt64(2, request.activation_time().ToInternalValue()); | |
| 126 statement.BindInt64(3, request.last_attempt_time().ToInternalValue()); | |
| 127 statement.BindInt64(4, request.started_attempt_count()); | |
| 128 statement.BindInt64(5, request.completed_attempt_count()); | |
| 129 statement.BindInt64(6, static_cast<int64_t>(request.request_state())); | |
| 130 statement.BindString(7, request.url().spec()); | |
| 131 statement.BindString(8, request.client_id().name_space); | |
| 132 statement.BindString(9, request.client_id().id); | |
| 133 | |
| 134 // TODO(fgorski): This will be an ItemActionStatus, with ALREADY_EXISTS as a | |
| 135 // return value for second if. | |
|
Pete Williamson
2016/09/21 00:00:08
Is this TODO already TODONE? If not, add a bit mo
fgorski
2016/09/21 05:07:50
Done.
| |
| 136 if (!statement.Run()) | |
| 137 return ItemActionStatus::STORE_ERROR; | |
| 138 if (db->GetLastChangeCount() == 0) | |
| 139 return ItemActionStatus::ALREADY_EXISTS; | |
| 140 return ItemActionStatus::SUCCESS; | |
| 141 } | |
| 142 | |
| 111 void BuildFailedResultList(const std::vector<int64_t>& request_ids, | 143 void BuildFailedResultList(const std::vector<int64_t>& request_ids, |
| 112 RequestQueue::UpdateMultipleRequestResults results) { | 144 RequestQueue::UpdateMultipleRequestResults results) { |
| 113 results.clear(); | 145 results.clear(); |
| 114 for (int64_t request_id : request_ids) { | 146 for (int64_t request_id : request_ids) { |
| 115 results.push_back(std::make_pair( | 147 results.push_back(std::make_pair( |
| 116 request_id, RequestQueue::UpdateRequestResult::STORE_FAILURE)); | 148 request_id, RequestQueue::UpdateRequestResult::STORE_FAILURE)); |
| 117 } | 149 } |
| 118 } | 150 } |
| 119 | 151 |
| 120 RequestQueue::UpdateRequestResult DeleteRequestById(sql::Connection* db, | 152 RequestQueue::UpdateRequestResult DeleteRequestById(sql::Connection* db, |
| (...skipping 153 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 274 sql::Statement statement(db->GetCachedStatement(SQL_FROM_HERE, kSql)); | 306 sql::Statement statement(db->GetCachedStatement(SQL_FROM_HERE, kSql)); |
| 275 | 307 |
| 276 std::vector<std::unique_ptr<SavePageRequest>> requests; | 308 std::vector<std::unique_ptr<SavePageRequest>> requests; |
| 277 while (statement.Step()) | 309 while (statement.Step()) |
| 278 requests.push_back(MakeSavePageRequest(statement)); | 310 requests.push_back(MakeSavePageRequest(statement)); |
| 279 | 311 |
| 280 runner->PostTask(FROM_HERE, base::Bind(callback, statement.Succeeded(), | 312 runner->PostTask(FROM_HERE, base::Bind(callback, statement.Succeeded(), |
| 281 base::Passed(&requests))); | 313 base::Passed(&requests))); |
| 282 } | 314 } |
| 283 | 315 |
| 316 void AddRequestSync(sql::Connection* db, | |
| 317 scoped_refptr<base::SingleThreadTaskRunner> runner, | |
| 318 const SavePageRequest& request, | |
| 319 const RequestQueueStore::AddCallback& callback) { | |
|
Pete Williamson
2016/09/21 00:00:08
Should we also have a TODO for UMA here?
fgorski
2016/09/21 05:07:50
Done.
| |
| 320 ItemActionStatus status = Insert(db, request); | |
| 321 runner->PostTask(FROM_HERE, base::Bind(callback, status)); | |
| 322 } | |
| 323 | |
| 284 void AddOrUpdateRequestSync(sql::Connection* db, | 324 void AddOrUpdateRequestSync(sql::Connection* db, |
| 285 scoped_refptr<base::SingleThreadTaskRunner> runner, | 325 scoped_refptr<base::SingleThreadTaskRunner> runner, |
| 286 const SavePageRequest& request, | 326 const SavePageRequest& request, |
| 287 const RequestQueueStore::UpdateCallback& callback) { | 327 const RequestQueueStore::UpdateCallback& callback) { |
| 288 // TODO(fgorski): add UMA metrics here. | 328 // TODO(fgorski): add UMA metrics here. |
| 289 RequestQueueStore::UpdateStatus status = InsertOrReplace(db, request); | 329 RequestQueueStore::UpdateStatus status = InsertOrReplace(db, request); |
| 290 runner->PostTask(FROM_HERE, base::Bind(callback, status)); | 330 runner->PostTask(FROM_HERE, base::Bind(callback, status)); |
| 291 } | 331 } |
| 292 | 332 |
| 293 void RemoveRequestsSync(sql::Connection* db, | 333 void RemoveRequestsSync(sql::Connection* db, |
| (...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 369 DCHECK(db_.get()); | 409 DCHECK(db_.get()); |
| 370 std::vector<std::unique_ptr<SavePageRequest>> requests; | 410 std::vector<std::unique_ptr<SavePageRequest>> requests; |
| 371 if (!CheckDb(base::Bind(callback, false, base::Passed(&requests)))) | 411 if (!CheckDb(base::Bind(callback, false, base::Passed(&requests)))) |
| 372 return; | 412 return; |
| 373 | 413 |
| 374 background_task_runner_->PostTask( | 414 background_task_runner_->PostTask( |
| 375 FROM_HERE, base::Bind(&GetRequestsSync, db_.get(), | 415 FROM_HERE, base::Bind(&GetRequestsSync, db_.get(), |
| 376 base::ThreadTaskRunnerHandle::Get(), callback)); | 416 base::ThreadTaskRunnerHandle::Get(), callback)); |
| 377 } | 417 } |
| 378 | 418 |
| 419 void RequestQueueStoreSQL::AddRequest(const SavePageRequest& request, | |
| 420 const AddCallback& callback) { | |
| 421 if (!CheckDb(base::Bind(callback, ItemActionStatus::STORE_ERROR))) | |
| 422 return; | |
| 423 | |
| 424 background_task_runner_->PostTask( | |
| 425 FROM_HERE, | |
| 426 base::Bind(&AddRequestSync, db_.get(), | |
| 427 base::ThreadTaskRunnerHandle::Get(), request, callback)); | |
| 428 } | |
| 429 | |
| 379 void RequestQueueStoreSQL::AddOrUpdateRequest(const SavePageRequest& request, | 430 void RequestQueueStoreSQL::AddOrUpdateRequest(const SavePageRequest& request, |
| 380 const UpdateCallback& callback) { | 431 const UpdateCallback& callback) { |
| 381 DCHECK(db_.get()); | 432 DCHECK(db_.get()); |
| 382 if (!CheckDb(base::Bind(callback, UpdateStatus::FAILED))) | 433 if (!CheckDb(base::Bind(callback, UpdateStatus::FAILED))) |
| 383 return; | 434 return; |
| 384 | 435 |
| 385 background_task_runner_->PostTask( | 436 background_task_runner_->PostTask( |
| 386 FROM_HERE, | 437 FROM_HERE, |
| 387 base::Bind(&AddOrUpdateRequestSync, db_.get(), | 438 base::Bind(&AddOrUpdateRequestSync, db_.get(), |
| 388 base::ThreadTaskRunnerHandle::Get(), request, callback)); | 439 base::ThreadTaskRunnerHandle::Get(), request, callback)); |
| 389 } | 440 } |
| 390 | 441 |
| 391 // RemoveRequestsByRequestId to be more parallell with RemoveRequestsByClientId. | 442 // RemoveRequestsByRequestId to be more parallel with RemoveRequestsByClientId. |
|
Pete Williamson
2016/09/21 00:00:08
Should we add "TODO" to this comment?
fgorski
2016/09/21 05:07:51
Done. It should be actually gone. Thanks for point
| |
| 392 void RequestQueueStoreSQL::RemoveRequests( | 443 void RequestQueueStoreSQL::RemoveRequests( |
| 393 const std::vector<int64_t>& request_ids, | 444 const std::vector<int64_t>& request_ids, |
| 394 const RemoveCallback& callback) { | 445 const RemoveCallback& callback) { |
| 395 // Set up a failed set of results in case we fail the DB check. | 446 // Set up a failed set of results in case we fail the DB check. |
| 396 RequestQueue::UpdateMultipleRequestResults results; | 447 RequestQueue::UpdateMultipleRequestResults results; |
| 397 for (int64_t request_id : request_ids) { | 448 for (int64_t request_id : request_ids) { |
| 398 results.push_back(std::make_pair( | 449 results.push_back(std::make_pair( |
| 399 request_id, RequestQueue::UpdateRequestResult::STORE_FAILURE)); | 450 request_id, RequestQueue::UpdateRequestResult::STORE_FAILURE)); |
| 400 } | 451 } |
| 401 | 452 |
| (...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 460 } | 511 } |
| 461 | 512 |
| 462 void RequestQueueStoreSQL::OnResetDone(const ResetCallback& callback, | 513 void RequestQueueStoreSQL::OnResetDone(const ResetCallback& callback, |
| 463 bool success) { | 514 bool success) { |
| 464 // Complete connection initialization post reset. | 515 // Complete connection initialization post reset. |
| 465 OnOpenConnectionDone(success); | 516 OnOpenConnectionDone(success); |
| 466 callback.Run(success); | 517 callback.Run(success); |
| 467 } | 518 } |
| 468 | 519 |
| 469 } // namespace offline_pages | 520 } // namespace offline_pages |
| OLD | NEW |