OLD | NEW |
---|---|
1 // Copyright (c) 2011 The LevelDB Authors. All rights reserved. | 1 // Copyright (c) 2011 The LevelDB 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. See the AUTHORS file for names of contributors. | 3 // found in the LICENSE file. See the AUTHORS file for names of contributors. |
4 | 4 |
5 #include "third_party/leveldatabase/env_chromium.h" | 5 #include "third_party/leveldatabase/env_chromium.h" |
6 | 6 |
7 #if defined(OS_POSIX) | 7 #if defined(OS_POSIX) |
8 #include <dirent.h> | 8 #include <dirent.h> |
9 #include <sys/types.h> | 9 #include <sys/types.h> |
10 #endif | 10 #endif |
(...skipping 27 matching lines...) Expand all Loading... | |
38 static base::File::Error LastFileError() { | 38 static base::File::Error LastFileError() { |
39 #if defined(OS_WIN) | 39 #if defined(OS_WIN) |
40 return base::File::OSErrorToFileError(GetLastError()); | 40 return base::File::OSErrorToFileError(GetLastError()); |
41 #else | 41 #else |
42 return base::File::OSErrorToFileError(errno); | 42 return base::File::OSErrorToFileError(errno); |
43 #endif | 43 #endif |
44 } | 44 } |
45 | 45 |
46 // Making direct platform in lieu of using base::FileEnumerator because the | 46 // Making direct platform in lieu of using base::FileEnumerator because the |
47 // latter can fail quietly without return an error result. | 47 // latter can fail quietly without return an error result. |
48 static base::File::Error GetDirectoryEntries( | 48 static base::File::Error GetDirectoryEntries(const FilePath& dir_param, |
49 const FilePath& dir_param, | 49 std::vector<FilePath>* result) { |
50 std::vector<FilePath>* result) { | |
51 result->clear(); | 50 result->clear(); |
52 #if defined(OS_WIN) | 51 #if defined(OS_WIN) |
53 FilePath dir_filepath = dir_param.Append(FILE_PATH_LITERAL("*")); | 52 FilePath dir_filepath = dir_param.Append(FILE_PATH_LITERAL("*")); |
54 WIN32_FIND_DATA find_data; | 53 WIN32_FIND_DATA find_data; |
55 HANDLE find_handle = FindFirstFile(dir_filepath.value().c_str(), &find_data); | 54 HANDLE find_handle = FindFirstFile(dir_filepath.value().c_str(), &find_data); |
56 if (find_handle == INVALID_HANDLE_VALUE) { | 55 if (find_handle == INVALID_HANDLE_VALUE) { |
57 DWORD last_error = GetLastError(); | 56 DWORD last_error = GetLastError(); |
58 if (last_error == ERROR_FILE_NOT_FOUND) | 57 if (last_error == ERROR_FILE_NOT_FOUND) |
59 return base::File::FILE_OK; | 58 return base::File::FILE_OK; |
60 return base::File::OSErrorToFileError(last_error); | 59 return base::File::OSErrorToFileError(last_error); |
(...skipping 532 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
593 bool result = base::CopyFile(base_name.AddExtension(backup_table_extension), | 592 bool result = base::CopyFile(base_name.AddExtension(backup_table_extension), |
594 table_name); | 593 table_name); |
595 std::string uma_name(name_); | 594 std::string uma_name(name_); |
596 uma_name.append(".TableRestore"); | 595 uma_name.append(".TableRestore"); |
597 base::BooleanHistogram::FactoryGet( | 596 base::BooleanHistogram::FactoryGet( |
598 uma_name, base::Histogram::kUmaTargetedHistogramFlag)->AddBoolean(result); | 597 uma_name, base::Histogram::kUmaTargetedHistogramFlag)->AddBoolean(result); |
599 return table_name; | 598 return table_name; |
600 } | 599 } |
601 | 600 |
602 void ChromiumEnv::RestoreIfNecessary(const std::string& dir, | 601 void ChromiumEnv::RestoreIfNecessary(const std::string& dir, |
603 std::vector<std::string>* result) { | 602 std::vector<std::string>* dir_entries) { |
604 std::set<FilePath> tables_found; | 603 std::set<FilePath> tables_found; |
605 std::set<FilePath> backups_found; | 604 std::set<FilePath> backups_found; |
606 for (std::vector<std::string>::iterator it = result->begin(); | 605 for (const auto& entry : *dir_entries) { |
607 it != result->end(); | 606 FilePath current = FilePath::FromUTF8Unsafe(entry); |
608 ++it) { | |
609 FilePath current = FilePath::FromUTF8Unsafe(*it); | |
610 if (current.MatchesExtension(table_extension)) | 607 if (current.MatchesExtension(table_extension)) |
611 tables_found.insert(current.RemoveExtension()); | 608 tables_found.insert(current.RemoveExtension()); |
612 if (current.MatchesExtension(backup_table_extension)) | 609 if (current.MatchesExtension(backup_table_extension)) |
613 backups_found.insert(current.RemoveExtension()); | 610 backups_found.insert(current.RemoveExtension()); |
614 } | 611 } |
615 std::set<FilePath> backups_only = | 612 std::set<FilePath> backups_only = |
616 base::STLSetDifference<std::set<FilePath>>(backups_found, tables_found); | 613 base::STLSetDifference<std::set<FilePath>>(backups_found, tables_found); |
617 | 614 |
618 if (backups_only.size()) { | 615 if (backups_only.size()) { |
619 std::string uma_name(name_); | 616 std::string uma_name(name_); |
620 uma_name.append(".MissingFiles"); | 617 uma_name.append(".MissingFiles"); |
621 int num_missing_files = | 618 int num_missing_files = |
622 backups_only.size() > INT_MAX ? INT_MAX : backups_only.size(); | 619 backups_only.size() > INT_MAX ? INT_MAX : backups_only.size(); |
623 base::Histogram::FactoryGet(uma_name, | 620 base::Histogram::FactoryGet(uma_name, |
624 1 /*min*/, | 621 1 /*min*/, |
625 100 /*max*/, | 622 100 /*max*/, |
626 8 /*num_buckets*/, | 623 8 /*num_buckets*/, |
627 base::Histogram::kUmaTargetedHistogramFlag) | 624 base::Histogram::kUmaTargetedHistogramFlag) |
628 ->Add(num_missing_files); | 625 ->Add(num_missing_files); |
629 } | 626 } |
630 FilePath dir_filepath = FilePath::FromUTF8Unsafe(dir); | 627 FilePath dir_path = FilePath::FromUTF8Unsafe(dir); |
631 for (std::set<FilePath>::iterator it = backups_only.begin(); | 628 for (const FilePath& backup : backups_only) { |
jsbell
2014/12/12 18:14:33
Why FilePath here but auto above (instead of std::
| |
632 it != backups_only.end(); ++it) { | 629 FilePath restored_table_name = RestoreFromBackup(dir_path.Append(backup)); |
633 FilePath restored_table_name = RestoreFromBackup(dir_filepath.Append(*it)); | 630 dir_entries->push_back(restored_table_name.BaseName().AsUTF8Unsafe()); |
634 result->push_back(restored_table_name.BaseName().AsUTF8Unsafe()); | |
635 } | 631 } |
636 } | 632 } |
637 | 633 |
638 Status ChromiumEnv::GetChildren(const std::string& dir_string, | 634 Status ChromiumEnv::GetChildren(const std::string& dir, |
639 std::vector<std::string>* result) { | 635 std::vector<std::string>* result) { |
640 std::vector<FilePath> entries; | 636 std::vector<FilePath> entries; |
641 base::File::Error error = | 637 base::File::Error error = |
642 GetDirectoryEntries(FilePath::FromUTF8Unsafe(dir_string), &entries); | 638 GetDirectoryEntries(FilePath::FromUTF8Unsafe(dir), &entries); |
643 if (error != base::File::FILE_OK) { | 639 if (error != base::File::FILE_OK) { |
644 RecordOSError(kGetChildren, error); | 640 RecordOSError(kGetChildren, error); |
645 return MakeIOError( | 641 return MakeIOError(dir, "Could not open/read directory", kGetChildren, |
646 dir_string, "Could not open/read directory", kGetChildren, error); | 642 error); |
647 } | 643 } |
648 | 644 |
649 result->clear(); | 645 result->clear(); |
650 for (const auto& entry : entries) | 646 for (const auto& entry : entries) |
651 result->push_back(entry.BaseName().AsUTF8Unsafe()); | 647 result->push_back(entry.BaseName().AsUTF8Unsafe()); |
652 | 648 |
653 if (make_backup_) | 649 if (make_backup_) |
654 RestoreIfNecessary(dir_string, result); | 650 RestoreIfNecessary(dir, result); |
655 | 651 |
656 return Status::OK(); | 652 return Status::OK(); |
657 } | 653 } |
658 | 654 |
659 Status ChromiumEnv::DeleteFile(const std::string& fname) { | 655 Status ChromiumEnv::DeleteFile(const std::string& fname) { |
660 Status result; | 656 Status result; |
661 FilePath fname_filepath = FilePath::FromUTF8Unsafe(fname); | 657 FilePath fname_filepath = FilePath::FromUTF8Unsafe(fname); |
662 // TODO(jorlow): Should we assert this is a file? | 658 // TODO(jorlow): Should we assert this is a file? |
663 if (!::base::DeleteFile(fname_filepath, false)) { | 659 if (!::base::DeleteFile(fname_filepath, false)) { |
664 result = MakeIOError(fname, "Could not delete file.", kDeleteFile); | 660 result = MakeIOError(fname, "Could not delete file.", kDeleteFile); |
(...skipping 426 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1091 | 1087 |
1092 Env* IDBEnv() { | 1088 Env* IDBEnv() { |
1093 return leveldb_env::idb_env.Pointer(); | 1089 return leveldb_env::idb_env.Pointer(); |
1094 } | 1090 } |
1095 | 1091 |
1096 Env* Env::Default() { | 1092 Env* Env::Default() { |
1097 return leveldb_env::default_env.Pointer(); | 1093 return leveldb_env::default_env.Pointer(); |
1098 } | 1094 } |
1099 | 1095 |
1100 } // namespace leveldb | 1096 } // namespace leveldb |
OLD | NEW |