OLD | NEW |
1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 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 "chrome/browser/sync_file_system/drive_backend/metadata_database.h" | 5 #include "chrome/browser/sync_file_system/drive_backend/metadata_database.h" |
6 | 6 |
7 #include <algorithm> | 7 #include <algorithm> |
8 #include <stack> | 8 #include <stack> |
9 | 9 |
10 #include "base/bind.h" | 10 #include "base/bind.h" |
(...skipping 701 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
712 return service_metadata_->has_sync_root_tracker_id() && | 712 return service_metadata_->has_sync_root_tracker_id() && |
713 !!service_metadata_->sync_root_tracker_id(); | 713 !!service_metadata_->sync_root_tracker_id(); |
714 } | 714 } |
715 | 715 |
716 void MetadataDatabase::PopulateInitialData( | 716 void MetadataDatabase::PopulateInitialData( |
717 int64 largest_change_id, | 717 int64 largest_change_id, |
718 const google_apis::FileResource& sync_root_folder, | 718 const google_apis::FileResource& sync_root_folder, |
719 const ScopedVector<google_apis::FileResource>& app_root_folders, | 719 const ScopedVector<google_apis::FileResource>& app_root_folders, |
720 const SyncStatusCallback& callback) { | 720 const SyncStatusCallback& callback) { |
721 DCHECK(worker_sequence_checker_.CalledOnValidSequencedThread()); | 721 DCHECK(worker_sequence_checker_.CalledOnValidSequencedThread()); |
722 DCHECK(index_->tracker_by_id_.empty()); | |
723 DCHECK(index_->metadata_by_id_.empty()); | |
724 | 722 |
725 scoped_ptr<leveldb::WriteBatch> batch(new leveldb::WriteBatch); | 723 scoped_ptr<leveldb::WriteBatch> batch(new leveldb::WriteBatch); |
726 service_metadata_->set_largest_change_id(largest_change_id); | 724 service_metadata_->set_largest_change_id(largest_change_id); |
727 UpdateLargestKnownChangeID(largest_change_id); | 725 UpdateLargestKnownChangeID(largest_change_id); |
728 | 726 |
729 AttachSyncRoot(sync_root_folder, batch.get()); | 727 AttachSyncRoot(sync_root_folder, batch.get()); |
730 for (size_t i = 0; i < app_root_folders.size(); ++i) | 728 for (size_t i = 0; i < app_root_folders.size(); ++i) |
731 AttachInitialAppRoot(*app_root_folders[i], batch.get()); | 729 AttachInitialAppRoot(*app_root_folders[i], batch.get()); |
732 | 730 |
733 WriteToDatabase(batch.Pass(), callback); | 731 WriteToDatabase(batch.Pass(), callback); |
(...skipping 726 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1460 return index_->HasDemotedDirtyTracker(); | 1458 return index_->HasDemotedDirtyTracker(); |
1461 } | 1459 } |
1462 | 1460 |
1463 bool MetadataDatabase::HasDirtyTracker() const { | 1461 bool MetadataDatabase::HasDirtyTracker() const { |
1464 DCHECK(worker_sequence_checker_.CalledOnValidSequencedThread()); | 1462 DCHECK(worker_sequence_checker_.CalledOnValidSequencedThread()); |
1465 return index_->PickDirtyTracker() != kInvalidTrackerID; | 1463 return index_->PickDirtyTracker() != kInvalidTrackerID; |
1466 } | 1464 } |
1467 | 1465 |
1468 size_t MetadataDatabase::CountDirtyTracker() const { | 1466 size_t MetadataDatabase::CountDirtyTracker() const { |
1469 DCHECK(worker_sequence_checker_.CalledOnValidSequencedThread()); | 1467 DCHECK(worker_sequence_checker_.CalledOnValidSequencedThread()); |
1470 return index_->dirty_trackers_.size() + | 1468 return index_->CountDirtyTracker(); |
1471 index_->demoted_dirty_trackers_.size(); | |
1472 } | 1469 } |
1473 | 1470 |
1474 bool MetadataDatabase::GetMultiParentFileTrackers(std::string* file_id_out, | 1471 bool MetadataDatabase::GetMultiParentFileTrackers(std::string* file_id_out, |
1475 TrackerIDSet* trackers_out) { | 1472 TrackerIDSet* trackers_out) { |
1476 DCHECK(worker_sequence_checker_.CalledOnValidSequencedThread()); | 1473 DCHECK(worker_sequence_checker_.CalledOnValidSequencedThread()); |
1477 DCHECK(file_id_out); | 1474 DCHECK(file_id_out); |
1478 DCHECK(trackers_out); | 1475 DCHECK(trackers_out); |
1479 | 1476 |
1480 std::string file_id = index_->PickMultiTrackerFileID(); | 1477 std::string file_id = index_->PickMultiTrackerFileID(); |
1481 if (file_id.empty()) | 1478 if (file_id.empty()) |
1482 return false; | 1479 return false; |
1483 | 1480 |
1484 TrackerIDSet trackers = index_->GetFileTrackerIDsByFileID(file_id); | 1481 TrackerIDSet trackers = index_->GetFileTrackerIDsByFileID(file_id); |
1485 if (trackers.size() <= 1) { | 1482 if (trackers.size() <= 1) { |
1486 NOTREACHED(); | 1483 NOTREACHED(); |
1487 return false; | 1484 return false; |
1488 } | 1485 } |
1489 | 1486 |
1490 *file_id_out = file_id; | 1487 *file_id_out = file_id; |
1491 std::swap(*trackers_out, trackers); | 1488 std::swap(*trackers_out, trackers); |
1492 return true; | 1489 return true; |
1493 } | 1490 } |
1494 | 1491 |
1495 size_t MetadataDatabase::CountFileMetadata() const { | 1492 size_t MetadataDatabase::CountFileMetadata() const { |
1496 DCHECK(worker_sequence_checker_.CalledOnValidSequencedThread()); | 1493 DCHECK(worker_sequence_checker_.CalledOnValidSequencedThread()); |
1497 return index_->metadata_by_id_.size(); | 1494 return index_->CountFileMetadata(); |
1498 } | 1495 } |
1499 | 1496 |
1500 size_t MetadataDatabase::CountFileTracker() const { | 1497 size_t MetadataDatabase::CountFileTracker() const { |
1501 DCHECK(worker_sequence_checker_.CalledOnValidSequencedThread()); | 1498 DCHECK(worker_sequence_checker_.CalledOnValidSequencedThread()); |
1502 return index_->tracker_by_id_.size(); | 1499 return index_->CountFileTracker(); |
1503 } | 1500 } |
1504 | 1501 |
1505 bool MetadataDatabase::GetConflictingTrackers(TrackerIDSet* trackers_out) { | 1502 bool MetadataDatabase::GetConflictingTrackers(TrackerIDSet* trackers_out) { |
1506 DCHECK(worker_sequence_checker_.CalledOnValidSequencedThread()); | 1503 DCHECK(worker_sequence_checker_.CalledOnValidSequencedThread()); |
1507 DCHECK(trackers_out); | 1504 DCHECK(trackers_out); |
1508 | 1505 |
1509 ParentIDAndTitle parent_and_title = index_->PickMultiBackingFilePath(); | 1506 ParentIDAndTitle parent_and_title = index_->PickMultiBackingFilePath(); |
1510 if (parent_and_title.parent_id == kInvalidTrackerID) | 1507 if (parent_and_title.parent_id == kInvalidTrackerID) |
1511 return false; | 1508 return false; |
1512 | 1509 |
(...skipping 456 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1969 }; | 1966 }; |
1970 std::vector<std::string> key_strings( | 1967 std::vector<std::string> key_strings( |
1971 trackerKeys, trackerKeys + ARRAYSIZE_UNSAFE(trackerKeys)); | 1968 trackerKeys, trackerKeys + ARRAYSIZE_UNSAFE(trackerKeys)); |
1972 base::ListValue* keys = new base::ListValue; | 1969 base::ListValue* keys = new base::ListValue; |
1973 keys->AppendStrings(key_strings); | 1970 keys->AppendStrings(key_strings); |
1974 metadata->SetString("title", "Trackers"); | 1971 metadata->SetString("title", "Trackers"); |
1975 metadata->Set("keys", keys); | 1972 metadata->Set("keys", keys); |
1976 trackers->Append(metadata); | 1973 trackers->Append(metadata); |
1977 | 1974 |
1978 // Append tracker data. | 1975 // Append tracker data. |
1979 for (MetadataDatabaseIndex::TrackerByID::const_iterator itr = | 1976 std::vector<int64> tracker_ids(index_->GetAllTrackerIDs()); |
1980 index_->tracker_by_id_.begin(); | 1977 for (std::vector<int64>::const_iterator itr = tracker_ids.begin(); |
1981 itr != index_->tracker_by_id_.end(); ++itr) { | 1978 itr != tracker_ids.end(); ++itr) { |
1982 const FileTracker& tracker = *itr->second; | 1979 const int64 tracker_id = *itr; |
| 1980 const FileTracker* tracker = index_->GetFileTracker(tracker_id); |
| 1981 if (!tracker) { |
| 1982 NOTREACHED(); |
| 1983 continue; |
| 1984 } |
| 1985 |
1983 base::DictionaryValue* dict = new base::DictionaryValue; | 1986 base::DictionaryValue* dict = new base::DictionaryValue; |
1984 base::FilePath path = BuildDisplayPathForTracker(tracker); | 1987 base::FilePath path = BuildDisplayPathForTracker(*tracker); |
1985 dict->SetString("tracker_id", base::Int64ToString(tracker.tracker_id())); | 1988 dict->SetString("tracker_id", base::Int64ToString(tracker_id)); |
1986 dict->SetString("path", path.AsUTF8Unsafe()); | 1989 dict->SetString("path", path.AsUTF8Unsafe()); |
1987 dict->SetString("file_id", tracker.file_id()); | 1990 dict->SetString("file_id", tracker->file_id()); |
1988 TrackerKind tracker_kind = tracker.tracker_kind(); | 1991 TrackerKind tracker_kind = tracker->tracker_kind(); |
1989 dict->SetString( | 1992 dict->SetString( |
1990 "tracker_kind", | 1993 "tracker_kind", |
1991 tracker_kind == TRACKER_KIND_APP_ROOT ? "AppRoot" : | 1994 tracker_kind == TRACKER_KIND_APP_ROOT ? "AppRoot" : |
1992 tracker_kind == TRACKER_KIND_DISABLED_APP_ROOT ? "Disabled App" : | 1995 tracker_kind == TRACKER_KIND_DISABLED_APP_ROOT ? "Disabled App" : |
1993 tracker.tracker_id() == GetSyncRootTrackerID() ? "SyncRoot" : | 1996 tracker->tracker_id() == GetSyncRootTrackerID() ? "SyncRoot" : |
1994 "Regular"); | 1997 "Regular"); |
1995 dict->SetString("app_id", tracker.app_id()); | 1998 dict->SetString("app_id", tracker->app_id()); |
1996 dict->SetString("active", tracker.active() ? "true" : "false"); | 1999 dict->SetString("active", tracker->active() ? "true" : "false"); |
1997 dict->SetString("dirty", tracker.dirty() ? "true" : "false"); | 2000 dict->SetString("dirty", tracker->dirty() ? "true" : "false"); |
1998 dict->SetString("folder_listing", | 2001 dict->SetString("folder_listing", |
1999 tracker.needs_folder_listing() ? "needed" : "no"); | 2002 tracker->needs_folder_listing() ? "needed" : "no"); |
2000 if (tracker.has_synced_details()) { | 2003 if (tracker->has_synced_details()) { |
2001 const FileDetails& details = tracker.synced_details(); | 2004 const FileDetails& details = tracker->synced_details(); |
2002 dict->SetString("title", details.title()); | 2005 dict->SetString("title", details.title()); |
2003 dict->SetString("kind", FileKindToString(details.file_kind())); | 2006 dict->SetString("kind", FileKindToString(details.file_kind())); |
2004 dict->SetString("md5", details.md5()); | 2007 dict->SetString("md5", details.md5()); |
2005 dict->SetString("etag", details.etag()); | 2008 dict->SetString("etag", details.etag()); |
2006 dict->SetString("missing", details.missing() ? "true" : "false"); | 2009 dict->SetString("missing", details.missing() ? "true" : "false"); |
2007 dict->SetString("change_id", base::Int64ToString(details.change_id())); | 2010 dict->SetString("change_id", base::Int64ToString(details.change_id())); |
2008 } | 2011 } |
2009 trackers->Append(dict); | 2012 trackers->Append(dict); |
2010 } | 2013 } |
2011 return trackers.Pass(); | 2014 return trackers.Pass(); |
(...skipping 12 matching lines...) Expand all Loading... |
2024 }; | 2027 }; |
2025 std::vector<std::string> key_strings( | 2028 std::vector<std::string> key_strings( |
2026 fileKeys, fileKeys + ARRAYSIZE_UNSAFE(fileKeys)); | 2029 fileKeys, fileKeys + ARRAYSIZE_UNSAFE(fileKeys)); |
2027 base::ListValue* keys = new base::ListValue; | 2030 base::ListValue* keys = new base::ListValue; |
2028 keys->AppendStrings(key_strings); | 2031 keys->AppendStrings(key_strings); |
2029 metadata->SetString("title", "Metadata"); | 2032 metadata->SetString("title", "Metadata"); |
2030 metadata->Set("keys", keys); | 2033 metadata->Set("keys", keys); |
2031 files->Append(metadata); | 2034 files->Append(metadata); |
2032 | 2035 |
2033 // Append metadata data. | 2036 // Append metadata data. |
2034 for (MetadataDatabaseIndex::MetadataByID::const_iterator itr = | 2037 std::vector<std::string> metadata_ids(index_->GetAllMetadataIDs()); |
2035 index_->metadata_by_id_.begin(); | 2038 for (std::vector<std::string>::const_iterator itr = metadata_ids.begin(); |
2036 itr != index_->metadata_by_id_.end(); ++itr) { | 2039 itr != metadata_ids.end(); ++itr) { |
2037 const FileMetadata& file = *itr->second; | 2040 const std::string& file_id = *itr; |
| 2041 const FileMetadata *file = index_->GetFileMetadata(file_id); |
| 2042 if (!file) { |
| 2043 NOTREACHED(); |
| 2044 continue; |
| 2045 } |
2038 | 2046 |
2039 base::DictionaryValue* dict = new base::DictionaryValue; | 2047 base::DictionaryValue* dict = new base::DictionaryValue; |
2040 dict->SetString("file_id", file.file_id()); | 2048 dict->SetString("file_id", file_id); |
2041 if (file.has_details()) { | 2049 if (file->has_details()) { |
2042 const FileDetails& details = file.details(); | 2050 const FileDetails& details = file->details(); |
2043 dict->SetString("title", details.title()); | 2051 dict->SetString("title", details.title()); |
2044 dict->SetString("type", FileKindToString(details.file_kind())); | 2052 dict->SetString("type", FileKindToString(details.file_kind())); |
2045 dict->SetString("md5", details.md5()); | 2053 dict->SetString("md5", details.md5()); |
2046 dict->SetString("etag", details.etag()); | 2054 dict->SetString("etag", details.etag()); |
2047 dict->SetString("missing", details.missing() ? "true" : "false"); | 2055 dict->SetString("missing", details.missing() ? "true" : "false"); |
2048 dict->SetString("change_id", base::Int64ToString(details.change_id())); | 2056 dict->SetString("change_id", base::Int64ToString(details.change_id())); |
2049 | 2057 |
2050 std::vector<std::string> parents; | 2058 std::vector<std::string> parents; |
2051 for (int i = 0; i < details.parent_folder_ids_size(); ++i) | 2059 for (int i = 0; i < details.parent_folder_ids_size(); ++i) |
2052 parents.push_back(details.parent_folder_ids(i)); | 2060 parents.push_back(details.parent_folder_ids(i)); |
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2095 index_->StoreFileMetadata(app_root_metadata.Pass()); | 2103 index_->StoreFileMetadata(app_root_metadata.Pass()); |
2096 index_->StoreFileTracker(app_root_tracker.Pass()); | 2104 index_->StoreFileTracker(app_root_tracker.Pass()); |
2097 } | 2105 } |
2098 | 2106 |
2099 void MetadataDatabase::DetachFromSequence() { | 2107 void MetadataDatabase::DetachFromSequence() { |
2100 worker_sequence_checker_.DetachFromSequence(); | 2108 worker_sequence_checker_.DetachFromSequence(); |
2101 } | 2109 } |
2102 | 2110 |
2103 } // namespace drive_backend | 2111 } // namespace drive_backend |
2104 } // namespace sync_file_system | 2112 } // namespace sync_file_system |
OLD | NEW |