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

Side by Side Diff: components/offline_pages/background/request_queue_store_sql.cc

Issue 2356433004: [Offline pages] Extracting AddRequest method in RequestQueueStore (Closed)
Patch Set: Updating the callback for AddRequest. 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 unified diff | Download patch
OLDNEW
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
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
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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698