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 |