| OLD | NEW |
| 1 // Copyright 2012 The Chromium Authors. All rights reserved. | 1 // Copyright 2012 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 "sync/syncable/directory_backing_store.h" | 5 #include "sync/syncable/directory_backing_store.h" |
| 6 | 6 |
| 7 #include "build/build_config.h" | 7 #include "build/build_config.h" |
| 8 | 8 |
| 9 #include <limits> | 9 #include <limits> |
| 10 | 10 |
| (...skipping 520 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 531 return false; | 531 return false; |
| 532 | 532 |
| 533 SafeDropTable("share_info"); | 533 SafeDropTable("share_info"); |
| 534 if (!db_->Execute("ALTER TABLE temp_share_info RENAME TO share_info")) | 534 if (!db_->Execute("ALTER TABLE temp_share_info RENAME TO share_info")) |
| 535 return false; | 535 return false; |
| 536 | 536 |
| 537 needs_column_refresh_ = false; | 537 needs_column_refresh_ = false; |
| 538 return true; | 538 return true; |
| 539 } | 539 } |
| 540 | 540 |
| 541 bool DirectoryBackingStore::LoadEntries( | 541 bool DirectoryBackingStore::LoadEntries(Directory::MetahandlesMap* handles_map, |
| 542 Directory::MetahandlesMap* handles_map) { | 542 MetahandleSet* metahandles_to_purge) { |
| 543 string select; | 543 string select; |
| 544 select.reserve(kUpdateStatementBufferSize); | 544 select.reserve(kUpdateStatementBufferSize); |
| 545 select.append("SELECT "); | 545 select.append("SELECT "); |
| 546 AppendColumnList(&select); | 546 AppendColumnList(&select); |
| 547 select.append(" FROM metas"); | 547 select.append(" FROM metas"); |
| 548 | 548 |
| 549 sql::Statement s(db_->GetUniqueStatement(select.c_str())); | 549 sql::Statement s(db_->GetUniqueStatement(select.c_str())); |
| 550 | 550 |
| 551 while (s.Step()) { | 551 while (s.Step()) { |
| 552 scoped_ptr<EntryKernel> kernel = UnpackEntry(&s); | 552 scoped_ptr<EntryKernel> kernel = UnpackEntry(&s); |
| 553 // A null kernel is evidence of external data corruption. | 553 // A null kernel is evidence of external data corruption. |
| 554 if (!kernel) | 554 if (!kernel) |
| 555 return false; | 555 return false; |
| 556 | 556 |
| 557 int64 handle = kernel->ref(META_HANDLE); | 557 int64 handle = kernel->ref(META_HANDLE); |
| 558 (*handles_map)[handle] = kernel.release(); | 558 if (SafeToPurgeOnLoading(*kernel)) |
| 559 metahandles_to_purge->insert(handle); |
| 560 else |
| 561 (*handles_map)[handle] = kernel.release(); |
| 559 } | 562 } |
| 560 return s.Succeeded(); | 563 return s.Succeeded(); |
| 561 } | 564 } |
| 562 | 565 |
| 566 bool DirectoryBackingStore::SafeToPurgeOnLoading( |
| 567 const EntryKernel& entry) const { |
| 568 if (entry.ref(IS_DEL)) { |
| 569 if (!entry.ref(IS_UNSYNCED) && !entry.ref(IS_UNAPPLIED_UPDATE)) |
| 570 return true; |
| 571 else if (!entry.ref(ID).ServerKnows()) |
| 572 return true; |
| 573 } |
| 574 return false; |
| 575 } |
| 576 |
| 563 bool DirectoryBackingStore::LoadDeleteJournals( | 577 bool DirectoryBackingStore::LoadDeleteJournals( |
| 564 JournalIndex* delete_journals) { | 578 JournalIndex* delete_journals) { |
| 565 string select; | 579 string select; |
| 566 select.reserve(kUpdateStatementBufferSize); | 580 select.reserve(kUpdateStatementBufferSize); |
| 567 select.append("SELECT "); | 581 select.append("SELECT "); |
| 568 AppendColumnList(&select); | 582 AppendColumnList(&select); |
| 569 select.append(" FROM deleted_metas"); | 583 select.append(" FROM deleted_metas"); |
| 570 | 584 |
| 571 sql::Statement s(db_->GetUniqueStatement(select.c_str())); | 585 sql::Statement s(db_->GetUniqueStatement(select.c_str())); |
| 572 | 586 |
| (...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 636 } | 650 } |
| 637 | 651 |
| 638 /* static */ | 652 /* static */ |
| 639 bool DirectoryBackingStore::SaveEntryToDB(sql::Statement* save_statement, | 653 bool DirectoryBackingStore::SaveEntryToDB(sql::Statement* save_statement, |
| 640 const EntryKernel& entry) { | 654 const EntryKernel& entry) { |
| 641 save_statement->Reset(true); | 655 save_statement->Reset(true); |
| 642 BindFields(entry, save_statement); | 656 BindFields(entry, save_statement); |
| 643 return save_statement->Run(); | 657 return save_statement->Run(); |
| 644 } | 658 } |
| 645 | 659 |
| 646 bool DirectoryBackingStore::DropDeletedEntries() { | |
| 647 if (!db_->Execute("DELETE FROM metas " | |
| 648 "WHERE is_del > 0 " | |
| 649 "AND is_unsynced < 1 " | |
| 650 "AND is_unapplied_update < 1")) { | |
| 651 return false; | |
| 652 } | |
| 653 if (!db_->Execute("DELETE FROM metas " | |
| 654 "WHERE is_del > 0 " | |
| 655 "AND id LIKE 'c%'")) { | |
| 656 return false; | |
| 657 } | |
| 658 return true; | |
| 659 } | |
| 660 | |
| 661 bool DirectoryBackingStore::SafeDropTable(const char* table_name) { | 660 bool DirectoryBackingStore::SafeDropTable(const char* table_name) { |
| 662 string query = "DROP TABLE IF EXISTS "; | 661 string query = "DROP TABLE IF EXISTS "; |
| 663 query.append(table_name); | 662 query.append(table_name); |
| 664 return db_->Execute(query.c_str()); | 663 return db_->Execute(query.c_str()); |
| 665 } | 664 } |
| 666 | 665 |
| 667 void DirectoryBackingStore::DropAllTables() { | 666 void DirectoryBackingStore::DropAllTables() { |
| 668 SafeDropTable("metas"); | 667 SafeDropTable("metas"); |
| 669 SafeDropTable("temp_metas"); | 668 SafeDropTable("temp_metas"); |
| 670 SafeDropTable("share_info"); | 669 SafeDropTable("share_info"); |
| (...skipping 917 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1588 } | 1587 } |
| 1589 query.append(" ) "); | 1588 query.append(" ) "); |
| 1590 values.append(" )"); | 1589 values.append(" )"); |
| 1591 query.append(values); | 1590 query.append(values); |
| 1592 save_statement->Assign(db_->GetUniqueStatement( | 1591 save_statement->Assign(db_->GetUniqueStatement( |
| 1593 base::StringPrintf(query.c_str(), "metas").c_str())); | 1592 base::StringPrintf(query.c_str(), "metas").c_str())); |
| 1594 } | 1593 } |
| 1595 | 1594 |
| 1596 } // namespace syncable | 1595 } // namespace syncable |
| 1597 } // namespace syncer | 1596 } // namespace syncer |
| OLD | NEW |