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

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

Issue 2262423002: Use a vector of smart pointers for callback return type. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: More compile fixes Created 4 years, 3 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"
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after
54 if (!CreateRequestQueueTable(db)) 54 if (!CreateRequestQueueTable(db))
55 return false; 55 return false;
56 56
57 // TODO(fgorski): Add indices here. 57 // TODO(fgorski): Add indices here.
58 return true; 58 return true;
59 } 59 }
60 60
61 // Create a save page request from a SQL result. Expects complete rows with 61 // Create a save page request from a SQL result. Expects complete rows with
62 // all columns present. Columns are in order they are defined in select query 62 // all columns present. Columns are in order they are defined in select query
63 // in |RequestQueueStore::RequestSync| method. 63 // in |RequestQueueStore::RequestSync| method.
64 SavePageRequest MakeSavePageRequest(const sql::Statement& statement) { 64 std::unique_ptr<SavePageRequest> MakeSavePageRequest(
65 const sql::Statement& statement) {
65 const int64_t id = statement.ColumnInt64(0); 66 const int64_t id = statement.ColumnInt64(0);
66 const base::Time creation_time = 67 const base::Time creation_time =
67 base::Time::FromInternalValue(statement.ColumnInt64(1)); 68 base::Time::FromInternalValue(statement.ColumnInt64(1));
68 const base::Time activation_time = 69 const base::Time activation_time =
69 base::Time::FromInternalValue(statement.ColumnInt64(2)); 70 base::Time::FromInternalValue(statement.ColumnInt64(2));
70 const base::Time last_attempt_time = 71 const base::Time last_attempt_time =
71 base::Time::FromInternalValue(statement.ColumnInt64(3)); 72 base::Time::FromInternalValue(statement.ColumnInt64(3));
72 const int64_t started_attempt_count = statement.ColumnInt64(4); 73 const int64_t started_attempt_count = statement.ColumnInt64(4);
73 const int64_t completed_attempt_count = statement.ColumnInt64(5); 74 const int64_t completed_attempt_count = statement.ColumnInt64(5);
74 const SavePageRequest::RequestState state = 75 const SavePageRequest::RequestState state =
75 static_cast<SavePageRequest::RequestState>(statement.ColumnInt64(6)); 76 static_cast<SavePageRequest::RequestState>(statement.ColumnInt64(6));
76 const GURL url(statement.ColumnString(7)); 77 const GURL url(statement.ColumnString(7));
77 const ClientId client_id(statement.ColumnString(8), 78 const ClientId client_id(statement.ColumnString(8),
78 statement.ColumnString(9)); 79 statement.ColumnString(9));
79 80
80 DVLOG(2) << "making save page request - id " << id << " url " << url 81 DVLOG(2) << "making save page request - id " << id << " url " << url
81 << " client_id " << client_id.name_space << "-" << client_id.id 82 << " client_id " << client_id.name_space << "-" << client_id.id
82 << " creation time " << creation_time << " user requested " 83 << " creation time " << creation_time << " user requested "
83 << kUserRequested; 84 << kUserRequested;
84 85
85 SavePageRequest request(id, url, client_id, creation_time, activation_time, 86 std::unique_ptr<SavePageRequest> request(new SavePageRequest(
86 kUserRequested); 87 id, url, client_id, creation_time, activation_time, kUserRequested));
87 request.set_last_attempt_time(last_attempt_time); 88 request->set_last_attempt_time(last_attempt_time);
88 request.set_started_attempt_count(started_attempt_count); 89 request->set_started_attempt_count(started_attempt_count);
89 request.set_completed_attempt_count(completed_attempt_count); 90 request->set_completed_attempt_count(completed_attempt_count);
90 request.set_request_state(state); 91 request->set_request_state(state);
91 return request; 92 return request;
92 } 93 }
93 94
94 // Get a request for a specific id. 95 // Get a request for a specific id.
95 SavePageRequest GetOneRequest(sql::Connection* db, const int64_t request_id) { 96 std::unique_ptr<SavePageRequest> GetOneRequest(sql::Connection* db,
97 const int64_t request_id) {
96 const char kSql[] = 98 const char kSql[] =
97 "SELECT request_id, creation_time, activation_time," 99 "SELECT request_id, creation_time, activation_time,"
98 " last_attempt_time, started_attempt_count, completed_attempt_count," 100 " last_attempt_time, started_attempt_count, completed_attempt_count,"
99 " state, url, client_namespace, client_id" 101 " state, url, client_namespace, client_id"
100 " FROM " REQUEST_QUEUE_TABLE_NAME " WHERE request_id=?"; 102 " FROM " REQUEST_QUEUE_TABLE_NAME " WHERE request_id=?";
101 103
102 sql::Statement statement(db->GetCachedStatement(SQL_FROM_HERE, kSql)); 104 sql::Statement statement(db->GetCachedStatement(SQL_FROM_HERE, kSql));
103 statement.BindInt64(0, request_id); 105 statement.BindInt64(0, request_id);
104 106
105 statement.Run(); 107 statement.Run();
(...skipping 27 matching lines...) Expand all
133 const SavePageRequest::RequestState new_state) { 135 const SavePageRequest::RequestState new_state) {
134 const char kSql[] = "UPDATE " REQUEST_QUEUE_TABLE_NAME 136 const char kSql[] = "UPDATE " REQUEST_QUEUE_TABLE_NAME
135 " SET state=?" 137 " SET state=?"
136 " WHERE request_id=?"; 138 " WHERE request_id=?";
137 sql::Statement statement(db->GetCachedStatement(SQL_FROM_HERE, kSql)); 139 sql::Statement statement(db->GetCachedStatement(SQL_FROM_HERE, kSql));
138 statement.BindInt64(0, static_cast<int64_t>(new_state)); 140 statement.BindInt64(0, static_cast<int64_t>(new_state));
139 statement.BindInt64(1, request_id); 141 statement.BindInt64(1, request_id);
140 return statement.Run(); 142 return statement.Run();
141 } 143 }
142 144
143 bool DeleteRequestsByIds(sql::Connection* db, 145 // Helper function to delete requests corresponding to passed in requestIds,
144 const std::vector<int64_t>& request_ids, 146 // and fill an outparam with the removed requests.
145 RequestQueue::UpdateMultipleRequestResults& results, 147 bool DeleteRequestsByIds(
146 std::vector<SavePageRequest>& requests) { 148 sql::Connection* db,
149 const std::vector<int64_t>& request_ids,
150 RequestQueue::UpdateMultipleRequestResults& results,
151 std::vector<std::unique_ptr<SavePageRequest>>& requests) {
147 // If you create a transaction but don't Commit() it is automatically 152 // If you create a transaction but don't Commit() it is automatically
148 // rolled back by its destructor when it falls out of scope. 153 // rolled back by its destructor when it falls out of scope.
149 sql::Transaction transaction(db); 154 sql::Transaction transaction(db);
150 if (!transaction.Begin()) { 155 if (!transaction.Begin()) {
151 BuildFailedResultList(request_ids, results); 156 BuildFailedResultList(request_ids, results);
152 return false; 157 return false;
153 } 158 }
154 159
155 // Read the request before we delete it, and if the delete worked, put it on 160 // Read the request before we delete it, and if the delete worked, put it on
156 // the queue of requests that got deleted. 161 // the queue of requests that got deleted.
157 for (int64_t request_id : request_ids) { 162 for (int64_t request_id : request_ids) {
158 SavePageRequest request = GetOneRequest(db, request_id); 163 std::unique_ptr<SavePageRequest> request = GetOneRequest(db, request_id);
159 RequestQueue::UpdateRequestResult result = 164 RequestQueue::UpdateRequestResult result =
160 DeleteRequestById(db, request_id); 165 DeleteRequestById(db, request_id);
161 results.push_back(std::make_pair(request_id, result)); 166 results.push_back(std::make_pair(request_id, result));
162 if (result == RequestQueue::UpdateRequestResult::SUCCESS) 167 if (result == RequestQueue::UpdateRequestResult::SUCCESS)
163 requests.push_back(request); 168 requests.push_back(std::move(request));
164 } 169 }
165 170
166 if (!transaction.Commit()) { 171 if (!transaction.Commit()) {
167 requests.clear(); 172 requests.clear();
168 BuildFailedResultList(request_ids, results); 173 BuildFailedResultList(request_ids, results);
169 return false; 174 return false;
170 } 175 }
171 176
172 return true; 177 return true;
173 } 178 }
174 179
175 bool ChangeRequestsState(sql::Connection* db, 180 bool ChangeRequestsState(
176 const std::vector<int64_t>& request_ids, 181 sql::Connection* db,
177 SavePageRequest::RequestState new_state, 182 const std::vector<int64_t>& request_ids,
178 RequestQueue::UpdateMultipleRequestResults& results, 183 SavePageRequest::RequestState new_state,
179 std::vector<SavePageRequest>& requests) { 184 RequestQueue::UpdateMultipleRequestResults& results,
185 std::vector<std::unique_ptr<SavePageRequest>>& requests) {
180 // If you create a transaction but don't Commit() it is automatically 186 // If you create a transaction but don't Commit() it is automatically
181 // rolled back by its destructor when it falls out of scope. 187 // rolled back by its destructor when it falls out of scope.
182 sql::Transaction transaction(db); 188 sql::Transaction transaction(db);
183 if (!transaction.Begin()) { 189 if (!transaction.Begin()) {
184 BuildFailedResultList(request_ids, results); 190 BuildFailedResultList(request_ids, results);
185 return false; 191 return false;
186 } 192 }
187 193
188 // Update a request, then get it, and put the item we got on the output list. 194 // Update a request, then get it, and put the item we got on the output list.
189 for (const auto& request_id : request_ids) { 195 for (const auto& request_id : request_ids) {
(...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after
287 scoped_refptr<base::SingleThreadTaskRunner> runner, 293 scoped_refptr<base::SingleThreadTaskRunner> runner,
288 const GetRequestsCallback& callback) { 294 const GetRequestsCallback& callback) {
289 const char kSql[] = 295 const char kSql[] =
290 "SELECT request_id, creation_time, activation_time," 296 "SELECT request_id, creation_time, activation_time,"
291 " last_attempt_time, started_attempt_count, completed_attempt_count," 297 " last_attempt_time, started_attempt_count, completed_attempt_count,"
292 " state, url, client_namespace, client_id" 298 " state, url, client_namespace, client_id"
293 " FROM " REQUEST_QUEUE_TABLE_NAME; 299 " FROM " REQUEST_QUEUE_TABLE_NAME;
294 300
295 sql::Statement statement(db->GetCachedStatement(SQL_FROM_HERE, kSql)); 301 sql::Statement statement(db->GetCachedStatement(SQL_FROM_HERE, kSql));
296 302
297 std::vector<SavePageRequest> result; 303 std::vector<std::unique_ptr<SavePageRequest>> requests;
298 while (statement.Step()) 304 while (statement.Step())
299 result.push_back(MakeSavePageRequest(statement)); 305 requests.push_back(MakeSavePageRequest(statement));
300 306
301 runner->PostTask(FROM_HERE, 307 runner->PostTask(FROM_HERE, base::Bind(callback, statement.Succeeded(),
302 base::Bind(callback, statement.Succeeded(), result)); 308 base::Passed(std::move(requests))));
303 } 309 }
304 310
305 // static 311 // static
306 void RequestQueueStoreSQL::AddOrUpdateRequestSync( 312 void RequestQueueStoreSQL::AddOrUpdateRequestSync(
307 sql::Connection* db, 313 sql::Connection* db,
308 scoped_refptr<base::SingleThreadTaskRunner> runner, 314 scoped_refptr<base::SingleThreadTaskRunner> runner,
309 const SavePageRequest& request, 315 const SavePageRequest& request,
310 const UpdateCallback& callback) { 316 const UpdateCallback& callback) {
311 // TODO(fgorski): add UMA metrics here. 317 // TODO(fgorski): add UMA metrics here.
312 RequestQueueStore::UpdateStatus status = InsertOrReplace(db, request); 318 RequestQueueStore::UpdateStatus status = InsertOrReplace(db, request);
313 runner->PostTask(FROM_HERE, base::Bind(callback, status)); 319 runner->PostTask(FROM_HERE, base::Bind(callback, status));
314 } 320 }
315 321
316 // static 322 // static
317 void RequestQueueStoreSQL::RemoveRequestsSync( 323 void RequestQueueStoreSQL::RemoveRequestsSync(
318 sql::Connection* db, 324 sql::Connection* db,
319 scoped_refptr<base::SingleThreadTaskRunner> runner, 325 scoped_refptr<base::SingleThreadTaskRunner> runner,
320 const std::vector<int64_t>& request_ids, 326 const std::vector<int64_t>& request_ids,
321 const RemoveCallback& callback) { 327 const RemoveCallback& callback) {
322 RequestQueue::UpdateMultipleRequestResults results; 328 RequestQueue::UpdateMultipleRequestResults results;
323 std::vector<SavePageRequest> requests; 329 std::vector<std::unique_ptr<SavePageRequest>> requests;
324 // TODO(fgorski): add UMA metrics here. 330 // TODO(fgorski): add UMA metrics here.
325 DeleteRequestsByIds(db, request_ids, results, requests); 331 DeleteRequestsByIds(db, request_ids, results, requests);
326 runner->PostTask(FROM_HERE, base::Bind(callback, results, requests)); 332 runner->PostTask(FROM_HERE, base::Bind(callback, results,
333 base::Passed(std::move(requests))));
327 } 334 }
328 335
329 // static 336 // static
330 void RequestQueueStoreSQL::ChangeRequestsStateSync( 337 void RequestQueueStoreSQL::ChangeRequestsStateSync(
331 sql::Connection* db, 338 sql::Connection* db,
332 scoped_refptr<base::SingleThreadTaskRunner> runner, 339 scoped_refptr<base::SingleThreadTaskRunner> runner,
333 const std::vector<int64_t>& request_ids, 340 const std::vector<int64_t>& request_ids,
334 const SavePageRequest::RequestState new_state, 341 const SavePageRequest::RequestState new_state,
335 const UpdateMultipleRequestsCallback& callback) { 342 const UpdateMultipleRequestsCallback& callback) {
336 RequestQueue::UpdateMultipleRequestResults results; 343 RequestQueue::UpdateMultipleRequestResults results;
337 std::vector<SavePageRequest> requests; 344 std::vector<std::unique_ptr<SavePageRequest>> requests;
338 // TODO(fgorski): add UMA metrics here. 345 // TODO(fgorski): add UMA metrics here.
339 offline_pages::ChangeRequestsState(db, request_ids, new_state, results, 346 offline_pages::ChangeRequestsState(db, request_ids, new_state, results,
340 requests); 347 requests);
341 runner->PostTask(FROM_HERE, base::Bind(callback, results, requests)); 348 runner->PostTask(FROM_HERE, base::Bind(callback, results,
349 base::Passed(std::move(requests))));
342 } 350 }
343 351
344 // static 352 // static
345 void RequestQueueStoreSQL::ResetSync( 353 void RequestQueueStoreSQL::ResetSync(
346 sql::Connection* db, 354 sql::Connection* db,
347 const base::FilePath& db_file_path, 355 const base::FilePath& db_file_path,
348 scoped_refptr<base::SingleThreadTaskRunner> runner, 356 scoped_refptr<base::SingleThreadTaskRunner> runner,
349 const ResetCallback& callback) { 357 const ResetCallback& callback) {
350 // This method deletes the content of the whole store and reinitializes it. 358 // This method deletes the content of the whole store and reinitializes it.
351 bool success = db->Raze(); 359 bool success = db->Raze();
(...skipping 10 matching lines...) Expand all
362 // to preserve the async style behavior to prevent bugs. 370 // to preserve the async style behavior to prevent bugs.
363 base::ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE, 371 base::ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE,
364 base::Bind(callback)); 372 base::Bind(callback));
365 return false; 373 return false;
366 } 374 }
367 return true; 375 return true;
368 } 376 }
369 377
370 void RequestQueueStoreSQL::GetRequests(const GetRequestsCallback& callback) { 378 void RequestQueueStoreSQL::GetRequests(const GetRequestsCallback& callback) {
371 DCHECK(db_.get()); 379 DCHECK(db_.get());
372 if (!CheckDb(base::Bind(callback, false, std::vector<SavePageRequest>()))) 380 std::vector<std::unique_ptr<SavePageRequest>> requests;
381 if (!CheckDb(base::Bind(callback, false, base::Passed(std::move(requests)))))
373 return; 382 return;
374 383
375 background_task_runner_->PostTask( 384 background_task_runner_->PostTask(
376 FROM_HERE, base::Bind(&RequestQueueStoreSQL::GetRequestsSync, db_.get(), 385 FROM_HERE, base::Bind(&RequestQueueStoreSQL::GetRequestsSync, db_.get(),
377 base::ThreadTaskRunnerHandle::Get(), callback)); 386 base::ThreadTaskRunnerHandle::Get(), callback));
378 } 387 }
379 388
380 void RequestQueueStoreSQL::AddOrUpdateRequest(const SavePageRequest& request, 389 void RequestQueueStoreSQL::AddOrUpdateRequest(const SavePageRequest& request,
381 const UpdateCallback& callback) { 390 const UpdateCallback& callback) {
382 DCHECK(db_.get()); 391 DCHECK(db_.get());
383 if (!CheckDb(base::Bind(callback, UpdateStatus::FAILED))) 392 if (!CheckDb(base::Bind(callback, UpdateStatus::FAILED)))
384 return; 393 return;
385 394
386 background_task_runner_->PostTask( 395 background_task_runner_->PostTask(
387 FROM_HERE, 396 FROM_HERE,
388 base::Bind(&RequestQueueStoreSQL::AddOrUpdateRequestSync, db_.get(), 397 base::Bind(&RequestQueueStoreSQL::AddOrUpdateRequestSync, db_.get(),
389 base::ThreadTaskRunnerHandle::Get(), request, callback)); 398 base::ThreadTaskRunnerHandle::Get(), request, callback));
390 } 399 }
391 400
392 // RemoveRequestsByRequestId to be more parallell with RemoveRequestsByClientId. 401 // RemoveRequestsByRequestId to be more parallell with RemoveRequestsByClientId.
393 void RequestQueueStoreSQL::RemoveRequests( 402 void RequestQueueStoreSQL::RemoveRequests(
394 const std::vector<int64_t>& request_ids, 403 const std::vector<int64_t>& request_ids,
395 const RemoveCallback& callback) { 404 const RemoveCallback& callback) {
396 // Set up a failed set of results in case we fail the DB check. 405 // Set up a failed set of results in case we fail the DB check.
397 RequestQueue::UpdateMultipleRequestResults results; 406 RequestQueue::UpdateMultipleRequestResults results;
398 std::vector<SavePageRequest> requests;
399 for (int64_t request_id : request_ids) 407 for (int64_t request_id : request_ids)
400 results.push_back(std::make_pair( 408 results.push_back(std::make_pair(
401 request_id, RequestQueue::UpdateRequestResult::STORE_FAILURE)); 409 request_id, RequestQueue::UpdateRequestResult::STORE_FAILURE));
402 410
403 if (!CheckDb(base::Bind(callback, results, requests))) 411 if (!CheckDb(base::Bind(
412 callback, results,
413 base::Passed(std::vector<std::unique_ptr<SavePageRequest>>()))))
fgorski 2016/08/31 23:27:23 nit: because some of conditions are growing, you s
Pete Williamson 2016/09/06 22:01:55 Done.
404 return; 414 return;
405 415
406 background_task_runner_->PostTask( 416 background_task_runner_->PostTask(
407 FROM_HERE, 417 FROM_HERE,
408 base::Bind(&RequestQueueStoreSQL::RemoveRequestsSync, db_.get(), 418 base::Bind(&RequestQueueStoreSQL::RemoveRequestsSync, db_.get(),
409 base::ThreadTaskRunnerHandle::Get(), request_ids, callback)); 419 base::ThreadTaskRunnerHandle::Get(), request_ids, callback));
410 } 420 }
411 421
412 void RequestQueueStoreSQL::ChangeRequestsState( 422 void RequestQueueStoreSQL::ChangeRequestsState(
413 const std::vector<int64_t>& request_ids, 423 const std::vector<int64_t>& request_ids,
414 const SavePageRequest::RequestState new_state, 424 const SavePageRequest::RequestState new_state,
415 const UpdateMultipleRequestsCallback& callback) { 425 const UpdateMultipleRequestsCallback& callback) {
416 RequestQueue::UpdateMultipleRequestResults results; 426 RequestQueue::UpdateMultipleRequestResults results;
417 std::vector<SavePageRequest> requests; 427 std::vector<std::unique_ptr<SavePageRequest>> requests;
418 if (!CheckDb(base::Bind(callback, results, requests))) 428 if (!CheckDb(
429 base::Bind(callback, results, base::Passed(std::move(requests)))))
419 return; 430 return;
420 431
421 background_task_runner_->PostTask( 432 background_task_runner_->PostTask(
422 FROM_HERE, base::Bind(&RequestQueueStoreSQL::ChangeRequestsStateSync, 433 FROM_HERE, base::Bind(&RequestQueueStoreSQL::ChangeRequestsStateSync,
423 db_.get(), base::ThreadTaskRunnerHandle::Get(), 434 db_.get(), base::ThreadTaskRunnerHandle::Get(),
424 request_ids, new_state, callback)); 435 request_ids, new_state, callback));
425 } 436 }
426 437
427 void RequestQueueStoreSQL::Reset(const ResetCallback& callback) { 438 void RequestQueueStoreSQL::Reset(const ResetCallback& callback) {
428 DCHECK(db_.get()); 439 DCHECK(db_.get());
(...skipping 28 matching lines...) Expand all
457 } 468 }
458 469
459 void RequestQueueStoreSQL::OnResetDone(const ResetCallback& callback, 470 void RequestQueueStoreSQL::OnResetDone(const ResetCallback& callback,
460 bool success) { 471 bool success) {
461 // Complete connection initialization post reset. 472 // Complete connection initialization post reset.
462 OnOpenConnectionDone(success); 473 OnOpenConnectionDone(success);
463 callback.Run(success); 474 callback.Run(success);
464 } 475 }
465 476
466 } // namespace offline_pages 477 } // namespace offline_pages
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698