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

Side by Side Diff: client/crash_report_database_win.cc

Issue 1395653002: crashpad_database_util: Don’t create a database unless explicitly asked (Closed) Base URL: https://chromium.googlesource.com/crashpad/crashpad@master
Patch Set: Created 5 years, 2 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 2015 The Crashpad Authors. All rights reserved. 1 // Copyright 2015 The Crashpad Authors. All rights reserved.
2 // 2 //
3 // Licensed under the Apache License, Version 2.0 (the "License"); 3 // Licensed under the Apache License, Version 2.0 (the "License");
4 // you may not use this file except in compliance with the License. 4 // you may not use this file except in compliance with the License.
5 // You may obtain a copy of the License at 5 // You may obtain a copy of the License at
6 // 6 //
7 // http://www.apache.org/licenses/LICENSE-2.0 7 // http://www.apache.org/licenses/LICENSE-2.0
8 // 8 //
9 // Unless required by applicable law or agreed to in writing, software 9 // Unless required by applicable law or agreed to in writing, software
10 // distributed under the License is distributed on an "AS IS" BASIS, 10 // distributed under the License is distributed on an "AS IS" BASIS,
(...skipping 465 matching lines...) Expand 10 before | Expand all | Expand 10 after
476 } 476 }
477 477
478 // static 478 // static
479 OperationStatus Metadata::VerifyReport(const ReportDisk& report_disk, 479 OperationStatus Metadata::VerifyReport(const ReportDisk& report_disk,
480 ReportState desired_state) { 480 ReportState desired_state) {
481 return (report_disk.state == desired_state) 481 return (report_disk.state == desired_state)
482 ? VerifyReportAnyState(report_disk) 482 ? VerifyReportAnyState(report_disk)
483 : CrashReportDatabase::kBusyError; 483 : CrashReportDatabase::kBusyError;
484 } 484 }
485 485
486 bool EnsureDirectory(const base::FilePath& path) {
487 DWORD fileattr = GetFileAttributes(path.value().c_str());
488 if (fileattr == INVALID_FILE_ATTRIBUTES) {
489 PLOG(ERROR) << "GetFileAttributes " << base::UTF16ToUTF8(path.value());
490 return false;
491 }
492 if ((fileattr & FILE_ATTRIBUTE_DIRECTORY) != 0)
493 return true;
494 LOG(ERROR) << "GetFileAttributes "
495 << base::UTF16ToUTF8(path.value())
496 << ": not a directory";
497 return false;
498 }
499
486 //! \brief Ensures that the node at path is a directory, and creates it if it 500 //! \brief Ensures that the node at path is a directory, and creates it if it
487 //! does not exist. 501 //! does not exist.
488 //! 502 //!
489 //! \return If the path points to a file, rather than a directory, or the 503 //! \return If the path points to a file, rather than a directory, or the
490 //! directory could not be created, returns `false`. Otherwise, returns 504 //! directory could not be created, returns `false`. Otherwise, returns
491 //! `true`, indicating that path already was or now is a directory. 505 //! `true`, indicating that path already was or now is a directory.
492 bool CreateDirectoryIfNecessary(const base::FilePath& path) { 506 bool CreateDirectoryIfNecessary(const base::FilePath& path) {
493 if (CreateDirectory(path.value().c_str(), nullptr)) 507 if (CreateDirectory(path.value().c_str(), nullptr))
494 return true; 508 return true;
495 if (GetLastError() != ERROR_ALREADY_EXISTS) { 509 if (GetLastError() != ERROR_ALREADY_EXISTS) {
496 PLOG(ERROR) << "CreateDirectory"; 510 PLOG(ERROR) << "CreateDirectory " << base::UTF16ToUTF8(path.value());
497 return false; 511 return false;
498 } 512 }
499 DWORD fileattr = GetFileAttributes(path.value().c_str()); 513 return EnsureDirectory(path);
500 if (fileattr == INVALID_FILE_ATTRIBUTES) {
501 PLOG(ERROR) << "GetFileAttributes";
502 return false;
503 }
504 if ((fileattr & FILE_ATTRIBUTE_DIRECTORY) != 0)
505 return true;
506 LOG(ERROR) << "not a directory";
507 return false;
508 } 514 }
509 515
510 // CrashReportDatabaseWin ------------------------------------------------------ 516 // CrashReportDatabaseWin ------------------------------------------------------
511 517
512 class CrashReportDatabaseWin : public CrashReportDatabase { 518 class CrashReportDatabaseWin : public CrashReportDatabase {
513 public: 519 public:
514 explicit CrashReportDatabaseWin(const base::FilePath& path); 520 explicit CrashReportDatabaseWin(const base::FilePath& path);
515 ~CrashReportDatabaseWin() override; 521 ~CrashReportDatabaseWin() override;
516 522
517 bool Initialize(); 523 bool Initialize(bool create);
518 524
519 // CrashReportDatabase: 525 // CrashReportDatabase:
520 Settings* GetSettings() override; 526 Settings* GetSettings() override;
521 OperationStatus PrepareNewCrashReport(NewReport** report) override; 527 OperationStatus PrepareNewCrashReport(NewReport** report) override;
522 OperationStatus FinishedWritingCrashReport(NewReport* report, 528 OperationStatus FinishedWritingCrashReport(NewReport* report,
523 UUID* uuid) override; 529 UUID* uuid) override;
524 OperationStatus ErrorWritingCrashReport(NewReport* report) override; 530 OperationStatus ErrorWritingCrashReport(NewReport* report) override;
525 OperationStatus LookUpCrashReport(const UUID& uuid, Report* report) override; 531 OperationStatus LookUpCrashReport(const UUID& uuid, Report* report) override;
526 OperationStatus GetPendingReports(std::vector<Report>* reports) override; 532 OperationStatus GetPendingReports(std::vector<Report>* reports) override;
527 OperationStatus GetCompletedReports(std::vector<Report>* reports) override; 533 OperationStatus GetCompletedReports(std::vector<Report>* reports) override;
(...skipping 17 matching lines...) Expand all
545 CrashReportDatabaseWin::CrashReportDatabaseWin(const base::FilePath& path) 551 CrashReportDatabaseWin::CrashReportDatabaseWin(const base::FilePath& path)
546 : CrashReportDatabase(), 552 : CrashReportDatabase(),
547 base_dir_(path), 553 base_dir_(path),
548 settings_(base_dir_.Append(kSettings)), 554 settings_(base_dir_.Append(kSettings)),
549 initialized_() { 555 initialized_() {
550 } 556 }
551 557
552 CrashReportDatabaseWin::~CrashReportDatabaseWin() { 558 CrashReportDatabaseWin::~CrashReportDatabaseWin() {
553 } 559 }
554 560
555 bool CrashReportDatabaseWin::Initialize() { 561 bool CrashReportDatabaseWin::Initialize(bool create) {
556 INITIALIZATION_STATE_SET_INITIALIZING(initialized_); 562 INITIALIZATION_STATE_SET_INITIALIZING(initialized_);
557 563
558 // Ensure the database and report subdirectories exist. 564 // Ensure the databse directory exists.
559 if (!CreateDirectoryIfNecessary(base_dir_) || 565 if (create) {
560 !CreateDirectoryIfNecessary(base_dir_.Append(kReportsDirectory))) 566 if (!CreateDirectoryIfNecessary(base_dir_))
567 return false;
568 } else if (!EnsureDirectory(base_dir_)) {
569 return false;
570 }
571
572 // Ensure that the report subdirectory exists.
573 if (!CreateDirectoryIfNecessary(base_dir_.Append(kReportsDirectory)))
561 return false; 574 return false;
562 575
563 // TODO(scottmg): When are completed reports pruned from disk? Delete here or 576 // TODO(scottmg): When are completed reports pruned from disk? Delete here or
564 // maybe on AcquireMetadata(). 577 // maybe on AcquireMetadata().
565 578
566 if (!settings_.Initialize()) 579 if (!settings_.Initialize())
567 return false; 580 return false;
568 581
569 INITIALIZATION_STATE_SET_VALID(initialized_); 582 INITIALIZATION_STATE_SET_VALID(initialized_);
570 return true; 583 return true;
(...skipping 177 matching lines...) Expand 10 before | Expand all | Expand 10 after
748 761
749 scoped_ptr<Metadata> CrashReportDatabaseWin::AcquireMetadata() { 762 scoped_ptr<Metadata> CrashReportDatabaseWin::AcquireMetadata() {
750 base::FilePath metadata_file = base_dir_.Append(kMetadataFileName); 763 base::FilePath metadata_file = base_dir_.Append(kMetadataFileName);
751 return Metadata::Create(metadata_file, base_dir_.Append(kReportsDirectory)); 764 return Metadata::Create(metadata_file, base_dir_.Append(kReportsDirectory));
752 } 765 }
753 766
754 } // namespace 767 } // namespace
755 768
756 // static 769 // static
757 scoped_ptr<CrashReportDatabase> CrashReportDatabase::Initialize( 770 scoped_ptr<CrashReportDatabase> CrashReportDatabase::Initialize(
758 const base::FilePath& path) { 771 const base::FilePath& path, bool create) {
759 scoped_ptr<CrashReportDatabaseWin> database_win( 772 scoped_ptr<CrashReportDatabaseWin> database_win(
760 new CrashReportDatabaseWin(path)); 773 new CrashReportDatabaseWin(path));
761 return database_win->Initialize() ? database_win.Pass() 774 return database_win->Initialize(create)
762 : scoped_ptr<CrashReportDatabaseWin>(); 775 ? database_win.Pass() : scoped_ptr<CrashReportDatabaseWin>();
763 } 776 }
764 777
765 } // namespace crashpad 778 } // namespace crashpad
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698