| 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/offline_page_metadata_store_sql.h" | 5 #include "components/offline_pages/offline_page_metadata_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 281 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 292 if (statement.Succeeded()) { | 292 if (statement.Succeeded()) { |
| 293 NotifyLoadResult(runner, callback, OfflinePageMetadataStore::LOAD_SUCCEEDED, | 293 NotifyLoadResult(runner, callback, OfflinePageMetadataStore::LOAD_SUCCEEDED, |
| 294 result); | 294 result); |
| 295 } else { | 295 } else { |
| 296 result.clear(); | 296 result.clear(); |
| 297 NotifyLoadResult(runner, callback, | 297 NotifyLoadResult(runner, callback, |
| 298 OfflinePageMetadataStore::STORE_LOAD_FAILED, result); | 298 OfflinePageMetadataStore::STORE_LOAD_FAILED, result); |
| 299 } | 299 } |
| 300 } | 300 } |
| 301 | 301 |
| 302 void AddOrUpdateOfflinePageSync( |
| 303 const OfflinePageItem& offline_page, |
| 304 sql::Connection* db, |
| 305 scoped_refptr<base::SingleThreadTaskRunner> runner, |
| 306 const OfflinePageMetadataStore::UpdateCallback& callback) { |
| 307 // TODO(bburns): add UMA metrics here (and for levelDB). |
| 308 bool ok = InsertOrReplace(db, offline_page); |
| 309 runner->PostTask(FROM_HERE, base::Bind(callback, ok)); |
| 310 } |
| 311 |
| 312 void RemoveOfflinePagesSync( |
| 313 const std::vector<int64_t>& offline_ids, |
| 314 sql::Connection* db, |
| 315 scoped_refptr<base::SingleThreadTaskRunner> runner, |
| 316 const OfflinePageMetadataStore::UpdateCallback& callback) { |
| 317 // TODO(bburns): add UMA metrics here (and for levelDB). |
| 318 |
| 319 // If you create a transaction but don't Commit() it is automatically |
| 320 // rolled back by its destructor when it falls out of scope. |
| 321 sql::Transaction transaction(db); |
| 322 if (!transaction.Begin()) { |
| 323 runner->PostTask(FROM_HERE, base::Bind(callback, false)); |
| 324 return; |
| 325 } |
| 326 |
| 327 for (auto offline_id : offline_ids) { |
| 328 if (!DeleteByOfflineId(db, offline_id)) { |
| 329 runner->PostTask(FROM_HERE, base::Bind(callback, false)); |
| 330 return; |
| 331 } |
| 332 } |
| 333 |
| 334 bool success = transaction.Commit(); |
| 335 runner->PostTask(FROM_HERE, base::Bind(callback, success)); |
| 336 } |
| 337 |
| 302 void ResetSync(sql::Connection* db, | 338 void ResetSync(sql::Connection* db, |
| 303 const base::FilePath& db_file_path, | 339 const base::FilePath& db_file_path, |
| 304 scoped_refptr<base::SingleThreadTaskRunner> runner, | 340 scoped_refptr<base::SingleThreadTaskRunner> runner, |
| 305 const base::Callback<void(StoreState)>& callback) { | 341 const base::Callback<void(StoreState)>& callback) { |
| 306 // This method deletes the content of the whole store and reinitializes it. | 342 // This method deletes the content of the whole store and reinitializes it. |
| 307 bool success = db->Raze(); | 343 bool success = db->Raze(); |
| 308 db->Close(); | 344 db->Close(); |
| 309 StoreState state; | 345 StoreState state; |
| 310 if (success) { | 346 if (success) { |
| 311 state = InitDatabase(db, db_file_path) | 347 state = InitDatabase(db, db_file_path) |
| (...skipping 17 matching lines...) Expand all Loading... |
| 329 OpenConnection(); | 365 OpenConnection(); |
| 330 } | 366 } |
| 331 | 367 |
| 332 OfflinePageMetadataStoreSQL::~OfflinePageMetadataStoreSQL() { | 368 OfflinePageMetadataStoreSQL::~OfflinePageMetadataStoreSQL() { |
| 333 if (db_.get() && | 369 if (db_.get() && |
| 334 !background_task_runner_->DeleteSoon(FROM_HERE, db_.release())) { | 370 !background_task_runner_->DeleteSoon(FROM_HERE, db_.release())) { |
| 335 DLOG(WARNING) << "SQL database will not be deleted."; | 371 DLOG(WARNING) << "SQL database will not be deleted."; |
| 336 } | 372 } |
| 337 } | 373 } |
| 338 | 374 |
| 339 void OfflinePageMetadataStoreSQL::AddOrUpdateOfflinePageSync( | |
| 340 const OfflinePageItem& offline_page, | |
| 341 sql::Connection* db, | |
| 342 scoped_refptr<base::SingleThreadTaskRunner> runner, | |
| 343 const UpdateCallback& callback) { | |
| 344 // TODO(bburns): add UMA metrics here (and for levelDB). | |
| 345 bool ok = InsertOrReplace(db, offline_page); | |
| 346 runner->PostTask(FROM_HERE, base::Bind(callback, ok)); | |
| 347 } | |
| 348 | |
| 349 void OfflinePageMetadataStoreSQL::RemoveOfflinePagesSync( | |
| 350 const std::vector<int64_t>& offline_ids, | |
| 351 sql::Connection* db, | |
| 352 scoped_refptr<base::SingleThreadTaskRunner> runner, | |
| 353 const UpdateCallback& callback) { | |
| 354 // TODO(bburns): add UMA metrics here (and for levelDB). | |
| 355 | |
| 356 // If you create a transaction but don't Commit() it is automatically | |
| 357 // rolled back by its destructor when it falls out of scope. | |
| 358 sql::Transaction transaction(db); | |
| 359 if (!transaction.Begin()) { | |
| 360 runner->PostTask(FROM_HERE, base::Bind(callback, false)); | |
| 361 return; | |
| 362 } | |
| 363 for (auto offline_id : offline_ids) { | |
| 364 if (!DeleteByOfflineId(db, offline_id)) { | |
| 365 runner->PostTask(FROM_HERE, base::Bind(callback, false)); | |
| 366 return; | |
| 367 } | |
| 368 } | |
| 369 | |
| 370 bool success = transaction.Commit(); | |
| 371 runner->PostTask(FROM_HERE, base::Bind(callback, success)); | |
| 372 } | |
| 373 | |
| 374 void OfflinePageMetadataStoreSQL::GetOfflinePages( | 375 void OfflinePageMetadataStoreSQL::GetOfflinePages( |
| 375 const LoadCallback& callback) { | 376 const LoadCallback& callback) { |
| 376 background_task_runner_->PostTask( | 377 background_task_runner_->PostTask( |
| 377 FROM_HERE, base::Bind(&GetOfflinePagesSync, db_.get(), | 378 FROM_HERE, base::Bind(&GetOfflinePagesSync, db_.get(), |
| 378 base::ThreadTaskRunnerHandle::Get(), callback)); | 379 base::ThreadTaskRunnerHandle::Get(), callback)); |
| 379 } | 380 } |
| 380 | 381 |
| 381 void OfflinePageMetadataStoreSQL::AddOrUpdateOfflinePage( | 382 void OfflinePageMetadataStoreSQL::AddOrUpdateOfflinePage( |
| 382 const OfflinePageItem& offline_page, | 383 const OfflinePageItem& offline_page, |
| 383 const UpdateCallback& callback) { | 384 const UpdateCallback& callback) { |
| 384 DCHECK(db_.get()); | 385 DCHECK(db_.get()); |
| 385 background_task_runner_->PostTask( | 386 background_task_runner_->PostTask( |
| 386 FROM_HERE, | 387 FROM_HERE, |
| 387 base::Bind(&OfflinePageMetadataStoreSQL::AddOrUpdateOfflinePageSync, | 388 base::Bind(&AddOrUpdateOfflinePageSync, offline_page, db_.get(), |
| 388 offline_page, db_.get(), base::ThreadTaskRunnerHandle::Get(), | 389 base::ThreadTaskRunnerHandle::Get(), callback)); |
| 389 callback)); | |
| 390 } | 390 } |
| 391 | 391 |
| 392 void OfflinePageMetadataStoreSQL::RemoveOfflinePages( | 392 void OfflinePageMetadataStoreSQL::RemoveOfflinePages( |
| 393 const std::vector<int64_t>& offline_ids, | 393 const std::vector<int64_t>& offline_ids, |
| 394 const UpdateCallback& callback) { | 394 const UpdateCallback& callback) { |
| 395 DCHECK(db_.get()); | 395 DCHECK(db_.get()); |
| 396 | 396 |
| 397 if (offline_ids.empty()) { | 397 if (offline_ids.empty()) { |
| 398 // Nothing to do, but post a callback instead of calling directly | 398 // Nothing to do, but post a callback instead of calling directly |
| 399 // to preserve the async style behavior to prevent bugs. | 399 // to preserve the async style behavior to prevent bugs. |
| 400 base::ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE, | 400 base::ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE, |
| 401 base::Bind(callback, true)); | 401 base::Bind(callback, true)); |
| 402 return; | 402 return; |
| 403 } | 403 } |
| 404 | 404 |
| 405 background_task_runner_->PostTask( | 405 background_task_runner_->PostTask( |
| 406 FROM_HERE, | 406 FROM_HERE, base::Bind(&RemoveOfflinePagesSync, offline_ids, db_.get(), |
| 407 base::Bind(&OfflinePageMetadataStoreSQL::RemoveOfflinePagesSync, | 407 base::ThreadTaskRunnerHandle::Get(), callback)); |
| 408 offline_ids, db_.get(), base::ThreadTaskRunnerHandle::Get(), | |
| 409 callback)); | |
| 410 } | 408 } |
| 411 | 409 |
| 412 void OfflinePageMetadataStoreSQL::Reset(const ResetCallback& callback) { | 410 void OfflinePageMetadataStoreSQL::Reset(const ResetCallback& callback) { |
| 413 if (!CheckDb(base::Bind(callback, false))) | 411 if (!CheckDb(base::Bind(callback, false))) |
| 414 return; | 412 return; |
| 415 | 413 |
| 416 background_task_runner_->PostTask( | 414 background_task_runner_->PostTask( |
| 417 FROM_HERE, | 415 FROM_HERE, |
| 418 base::Bind(&ResetSync, db_.get(), db_file_path_, | 416 base::Bind(&ResetSync, db_.get(), db_file_path_, |
| 419 base::ThreadTaskRunnerHandle::Get(), | 417 base::ThreadTaskRunnerHandle::Get(), |
| (...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 459 DCHECK(db_.get()); | 457 DCHECK(db_.get()); |
| 460 if (!db_.get()) { | 458 if (!db_.get()) { |
| 461 base::ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE, | 459 base::ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE, |
| 462 base::Bind(callback)); | 460 base::Bind(callback)); |
| 463 return false; | 461 return false; |
| 464 } | 462 } |
| 465 return true; | 463 return true; |
| 466 } | 464 } |
| 467 | 465 |
| 468 } // namespace offline_pages | 466 } // namespace offline_pages |
| OLD | NEW |