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 |