Chromium Code Reviews| Index: chrome/browser/sync_file_system/drive_backend/metadata_database.cc |
| diff --git a/chrome/browser/sync_file_system/drive_backend/metadata_database.cc b/chrome/browser/sync_file_system/drive_backend/metadata_database.cc |
| index cec2549101b7e05820c2f34d6ef99c57d2171fed..05fee1a17a30ef9851a97147a9f7bc16f54883b8 100644 |
| --- a/chrome/browser/sync_file_system/drive_backend/metadata_database.cc |
| +++ b/chrome/browser/sync_file_system/drive_backend/metadata_database.cc |
| @@ -756,6 +756,23 @@ bool MetadataDatabase::BuildPathForTracker(int64 tracker_id, |
| return true; |
| } |
| +base::FilePath MetadataDatabase::BuildDisplayPathForTracker( |
| + const FileTracker& tracker) const { |
| + base::FilePath path; |
| + if (tracker.active()) { |
| + BuildPathForTracker(tracker.tracker_id(), &path); |
| + return path; |
| + } |
| + BuildPathForTracker(tracker.parent_tracker_id(), &path); |
| + if (tracker.has_synced_details()) { |
| + path = path.Append( |
| + base::FilePath::FromUTF8Unsafe(tracker.synced_details().title())); |
| + } else { |
| + path = path.Append(FILE_PATH_LITERAL("<unknown>")); |
| + } |
| + return path; |
| +} |
| + |
| bool MetadataDatabase::FindNearestActiveAncestor( |
| const std::string& app_id, |
| const base::FilePath& full_path, |
| @@ -1747,18 +1764,7 @@ scoped_ptr<base::ListValue> MetadataDatabase::DumpFiles( |
| FileTracker* tracker = tracker_by_id_[tracker_id]; |
| base::DictionaryValue* file = new DictionaryValue; |
| - base::FilePath path; |
| - if (tracker->active()) { |
| - BuildPathForTracker(tracker->tracker_id(), &path); |
| - } else { |
| - BuildPathForTracker(tracker->parent_tracker_id(), &path); |
| - if (tracker->has_synced_details()) { |
| - path = path.Append( |
| - base::FilePath::FromUTF8Unsafe(tracker->synced_details().title())); |
| - } else { |
| - path = path.Append(FILE_PATH_LITERAL("unknown")); |
| - } |
| - } |
| + base::FilePath path = BuildDisplayPathForTracker(*tracker); |
| file->SetString("path", path.AsUTF8Unsafe()); |
| if (tracker->has_synced_details()) { |
| file->SetString("title", tracker->synced_details().title()); |
| @@ -1782,6 +1788,13 @@ scoped_ptr<base::ListValue> MetadataDatabase::DumpFiles( |
| return files.Pass(); |
| } |
| +scoped_ptr<base::ListValue> MetadataDatabase::DumpDatabase() { |
| + scoped_ptr<base::ListValue> list(new base::ListValue); |
| + list->Append(DumpTrackers().release()); |
| + list->Append(DumpMetadata().release()); |
| + return list.Pass(); |
| +} |
| + |
| bool MetadataDatabase::HasNewerFileMetadata(const std::string& file_id, |
| int64 change_id) { |
| FileByID::const_iterator found = file_by_id_.find(file_id); |
| @@ -1791,5 +1804,103 @@ bool MetadataDatabase::HasNewerFileMetadata(const std::string& file_id, |
| return found->second->details().change_id() >= change_id; |
| } |
| +scoped_ptr<base::ListValue> MetadataDatabase::DumpTrackers() { |
| + scoped_ptr<base::ListValue> trackers(new base::ListValue); |
| + |
| + // Append the first element for metadata. |
| + base::DictionaryValue* metadata = new DictionaryValue; |
| + const char *trackerKeys[] = { |
| + "tracker_id", "path", "file_id", "tracker_kind", |
| + "active", "dirty", "folder_listing", |
| + "title", "kind", "md5", "etag", "missing", "change_id", |
| + }; |
| + std::vector<std::string> key_strings( |
| + trackerKeys, trackerKeys + ARRAYSIZE_UNSAFE(trackerKeys)); |
| + base::ListValue* keys = new ListValue; |
| + keys->AppendStrings(key_strings); |
| + metadata->SetString("title", "Trackers"); |
| + metadata->Set("keys", keys); |
| + trackers->Append(metadata); |
| + |
| + // Appends tracker data. |
| + for (TrackerByID::const_iterator itr = tracker_by_id_.begin(); |
| + itr != tracker_by_id_.end(); ++itr) { |
| + const FileTracker& tracker = *itr->second; |
| + base::DictionaryValue* dict = new DictionaryValue; |
| + base::FilePath path = BuildDisplayPathForTracker(tracker); |
| + dict->SetString("tracker_id", base::Int64ToString(tracker.tracker_id())); |
| + dict->SetString("path", path.AsUTF8Unsafe()); |
| + dict->SetString("file_id", tracker.file_id()); |
| + TrackerKind tracker_kind = tracker.tracker_kind(); |
| + dict->SetString( |
| + "tracker_kind", |
| + tracker_kind == TRACKER_KIND_APP_ROOT ? "AppRoot" : |
| + tracker_kind == TRACKER_KIND_DISABLED_APP_ROOT ? "Disabled App" : |
| + tracker.tracker_id() == GetSyncRootTrackerID() ? "SyncRoot" : |
| + "regular"); |
|
tzik
2013/12/06 07:05:52
s/regular/Regular/?
kinuko
2013/12/06 07:26:23
Done.
|
| + dict->SetString("active", tracker.active() ? "true" : "false"); |
| + dict->SetString("dirty", tracker.dirty() ? "true" : "false"); |
| + dict->SetString("folder_listing", |
| + tracker.needs_folder_listing() ? "needed" : "no"); |
| + if (tracker.has_synced_details()) { |
| + const FileDetails& details = tracker.synced_details(); |
| + dict->SetString("title", details.title()); |
| + dict->SetString("kind", FileKindToString(details.file_kind())); |
| + dict->SetString("md5", details.md5()); |
| + dict->SetString("etag", details.etag()); |
| + dict->SetString("missing", details.missing() ? "true" : "false"); |
| + dict->SetString("change_id", base::Int64ToString(details.change_id())); |
| + } |
| + trackers->Append(dict); |
| + } |
| + return trackers.Pass(); |
| +} |
| + |
| +scoped_ptr<base::ListValue> MetadataDatabase::DumpMetadata() { |
| + scoped_ptr<base::ListValue> files(new base::ListValue); |
| + |
| + // Append the first element for metadata. |
| + base::DictionaryValue* metadata = new DictionaryValue; |
| + const char *fileKeys[] = { |
| + "file_id", "title", "type", "md5", "etag", "missing", |
| + "change_id", "parents" |
| + }; |
| + std::vector<std::string> key_strings( |
| + fileKeys, fileKeys + ARRAYSIZE_UNSAFE(fileKeys)); |
| + base::ListValue* keys = new ListValue; |
| + keys->AppendStrings(key_strings); |
| + metadata->SetString("title", "Metadata"); |
| + metadata->Set("keys", keys); |
| + files->Append(metadata); |
| + |
| + // Appends tracker data. |
| + for (FileByID::const_iterator itr = file_by_id_.begin(); |
| + itr != file_by_id_.end(); ++itr) { |
| + const FileMetadata& file = *itr->second; |
| + |
| + base::DictionaryValue* dict = new DictionaryValue; |
| + dict->SetString("file_id", file.file_id()); |
| + if (file.has_details()) { |
| + const FileDetails& details = file.details(); |
| + dict->SetString("title", details.title()); |
| + dict->SetString("type", FileKindToString(details.file_kind())); |
| + dict->SetString("md5", details.md5()); |
| + dict->SetString("etag", details.etag()); |
| + dict->SetString("missing", details.missing() ? "true" : "false"); |
| + dict->SetString("change_id", base::Int64ToString(details.change_id())); |
| + |
| + std::string parents; |
| + parents.reserve(details.parent_folder_ids_size() * 32); |
| + for (int i = 0; i < details.parent_folder_ids_size(); ++i) { |
| + parents.append(details.parent_folder_ids(i)); |
| + parents.append(","); |
| + } |
| + dict->SetString("parents", parents); |
| + } |
| + files->Append(dict); |
| + } |
| + return files.Pass(); |
| +} |
| + |
| } // namespace drive_backend |
| } // namespace sync_file_system |