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

Side by Side Diff: sync/syncable/directory_backing_store.cc

Issue 1008103002: Sync: Avoid 3 passes over SyncDarta DB when loading the directory from the disk (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Addressed CR feedback. Created 5 years, 9 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 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
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
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
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
OLDNEW
« no previous file with comments | « sync/syncable/directory_backing_store.h ('k') | sync/syncable/directory_backing_store_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698