| Index: client/crash_report_database.h
|
| diff --git a/client/crash_report_database.h b/client/crash_report_database.h
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..3db2f583b978b4d32fc19c9394eabb805d2964d2
|
| --- /dev/null
|
| +++ b/client/crash_report_database.h
|
| @@ -0,0 +1,255 @@
|
| +// Copyright 2015 The Crashpad Authors. All rights reserved.
|
| +//
|
| +// Licensed under the Apache License, Version 2.0 (the "License");
|
| +// you may not use this file except in compliance with the License.
|
| +// You may obtain a copy of the License at
|
| +//
|
| +// http://www.apache.org/licenses/LICENSE-2.0
|
| +//
|
| +// Unless required by applicable law or agreed to in writing, software
|
| +// distributed under the License is distributed on an "AS IS" BASIS,
|
| +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
| +// See the License for the specific language governing permissions and
|
| +// limitations under the License.
|
| +
|
| +#ifndef CRASHPAD_CLIENT_CRASH_REPORT_DATABASE_H_
|
| +#define CRASHPAD_CLIENT_CRASH_REPORT_DATABASE_H_
|
| +
|
| +#include <time.h>
|
| +
|
| +#include <string>
|
| +#include <vector>
|
| +
|
| +#include "base/basictypes.h"
|
| +#include "base/files/file_path.h"
|
| +#include "base/memory/scoped_ptr.h"
|
| +#include "util/file/file_io.h"
|
| +#include "util/misc/uuid.h"
|
| +
|
| +namespace crashpad {
|
| +
|
| +//! \brief An interface for managing a collection of crash report files and
|
| +//! metadata associated with the crash reports.
|
| +//!
|
| +//! All Report objects that are returned by this class are logically const.
|
| +//! They are snapshots of the database at the time the query was run, and the
|
| +//! data returned is liable to change after the query is executed.
|
| +//!
|
| +//! The lifecycle of a crash report has three stages:
|
| +//!
|
| +//! 1. New: A crash report is created with PrepareNewCrashReport(), the
|
| +//! the client then writes the report, and then calls
|
| +//! FinishedWritingCrashReport() to make the report Pending.
|
| +//! 2. Pending: The report has been written but has not been locally
|
| +//! processed.
|
| +//! 3. Completed: The report has been locally processed, either by uploading
|
| +//! it to a collection server and calling RecordUploadAttempt(), or by
|
| +//! calling SkipReportUpload().
|
| +class CrashReportDatabase {
|
| + public:
|
| + //! \brief A crash report record.
|
| + //!
|
| + //! This represents the metadata for a crash report, as well as the location
|
| + //! of the report itself. A CrashReportDatabase maintains at least this
|
| + //! information.
|
| + struct Report {
|
| + Report();
|
| +
|
| + //! A unique identifier by which this report will always be known to the
|
| + //! database.
|
| + UUID uuid;
|
| +
|
| + //! The current location of the crash report on the client’s filesystem.
|
| + //! The location of a crash report may change over time, so the UUID should
|
| + //! be used as the canonical identifier.
|
| + base::FilePath file_path;
|
| +
|
| + //! An identifier issued to this crash report by a collection server.
|
| + std::string id;
|
| +
|
| + //! The time at which the report was generated.
|
| + time_t creation_time;
|
| +
|
| + //! Whether this crash report was successfully uploaded to a collection
|
| + //! server.
|
| + bool uploaded;
|
| +
|
| + //! The last timestamp at which an attempt was made to submit this crash
|
| + //! report to a collection server. If this is zero, then the report has
|
| + //! never been uploaded. If #uploaded is true, then this timestamp is the
|
| + //! time at which the report was uploaded, and no other attempts to upload
|
| + //! this report will be made.
|
| + time_t last_upload_attempt_time;
|
| +
|
| + //! The number of times an attempt was made to submit this report to
|
| + //! a collection server. If this is more than zero, then
|
| + //! #last_upload_attempt_time will be set to the timestamp of the most
|
| + //! recent attempt.
|
| + int upload_attempts;
|
| + };
|
| +
|
| + //! \brief A crash report that is in the process of being written.
|
| + //!
|
| + //! An instance of this struct should be created via PrepareNewCrashReport()
|
| + //! and destroyed with FinishedWritingCrashReport().
|
| + struct NewReport {
|
| + //! The file handle to which the report should be written.
|
| + FileHandle handle;
|
| +
|
| + //! The path to the crash report being written.
|
| + base::FilePath path;
|
| + };
|
| +
|
| + //! \brief The result code for operations performed on a database.
|
| + enum OperationStatus {
|
| + //! \brief No error occurred.
|
| + kNoError = 0,
|
| +
|
| + //! \brief The report that was requested could not be located.
|
| + kReportNotFound,
|
| +
|
| + //! \brief An error occured while performing a file operation on a crash
|
| + //! report.
|
| + //!
|
| + //! A database is responsible for managing both the metadata about a report
|
| + //! and the actual crash report itself. This error is returned when an
|
| + //! error occurred when managing the report file. Additional information
|
| + //! will be logged.
|
| + kFileSystemError,
|
| +
|
| + //! \brief An error occured while recording metadata for a crash report.
|
| + //!
|
| + //! A database is responsible for managing both the metadata about a report
|
| + //! and the actual crash report itself. This error is returned when an
|
| + //! error occurred when managing the metadata about a crash report.
|
| + //! Additional information will be logged.
|
| + kDatabaseError,
|
| +
|
| + //! \brief The operation could not be completed because a concurrent
|
| + //! operation affecting the report is occurring.
|
| + kBusyError,
|
| + };
|
| +
|
| + virtual ~CrashReportDatabase() {}
|
| +
|
| + //! \brief Initializes a database of crash reports.
|
| + //!
|
| + //! \param[in] path A path to a writable directory, where the database can
|
| + //! be created or opened.
|
| + //!
|
| + //! \return A database object on success, `nullptr` on failure with an error
|
| + //! logged.
|
| + static scoped_ptr<CrashReportDatabase> Initialize(const base::FilePath& path);
|
| +
|
| + //! \brief Creates a record of a new crash report.
|
| + //!
|
| + //! Callers can then write the crash report using the file handle provided.
|
| + //! The caller does not own this handle, and it must be explicitly closed with
|
| + //! FinishedWritingCrashReport().
|
| + //!
|
| + //! \param[out] report A file handle to which the crash report data should be
|
| + //! written. Only valid if this returns #kNoError. The caller must not
|
| + //! close this handle.
|
| + //!
|
| + //! \return The operation status code.
|
| + virtual OperationStatus PrepareNewCrashReport(NewReport** report) = 0;
|
| +
|
| + //! \brief Informs the database that a crash report has been written.
|
| + //!
|
| + //! After calling this method, the database is permitted to move and rename
|
| + //! the file at Report::file_path.
|
| + //!
|
| + //! \param[in] report A handle obtained with PrepareNewCrashReport(). The
|
| + //! handle will be invalidated as part of this call.
|
| + //! \param[out] uuid The UUID of this crash report.
|
| + //!
|
| + //! \return The operation status code.
|
| + virtual OperationStatus FinishedWritingCrashReport(NewReport* report,
|
| + UUID* uuid) = 0;
|
| +
|
| + //! \brief Returns the crash report record for the unique identifier.
|
| + //!
|
| + //! \param[in] uuid The crash report record unique identifier.
|
| + //! \param[out] report A crash report record. Only valid if this returns
|
| + //! #kNoError.
|
| + //!
|
| + //! \return The operation status code.
|
| + virtual OperationStatus LookUpCrashReport(const UUID& uuid,
|
| + Report* report) = 0;
|
| +
|
| + //! \brief Returns a list of crash report records that have not been uploaded.
|
| + //!
|
| + //! \param[out] reports A list of crash report record objects. This must be
|
| + //! empty on entry. Only valid if this returns #kNoError.
|
| + //!
|
| + //! \return The operation status code.
|
| + virtual OperationStatus GetPendingReports(
|
| + std::vector<const Report>* reports) = 0;
|
| +
|
| + //! \brief Returns a list of crash report records that have been completed,
|
| + //! either by being uploaded or by skipping upload.
|
| + //!
|
| + //! \param[out] reports A list of crash report record objects. This must be
|
| + //! empty on entry. Only valid if this returns #kNoError.
|
| + //!
|
| + //! \return The operation status code.
|
| + virtual OperationStatus GetCompletedReports(
|
| + std::vector<const Report>* reports) = 0;
|
| +
|
| + //! \brief Obtains a report object for uploading to a collection server.
|
| + //!
|
| + //! The file at Report::file_path should be uploaded by the caller, and then
|
| + //! the returned Report object must be disposed of via a call to
|
| + //! RecordUploadAttempt().
|
| + //!
|
| + //! A subsequent call to this method with the same \a uuid is illegal until
|
| + //! RecordUploadAttempt() has been called.
|
| + //!
|
| + //! \param[in] uuid The unique identifier for the crash report record.
|
| + //! \param[out] report A crash report record for the report to be uploaded.
|
| + //! The caller does not own this object. Only valid if this returns
|
| + //! #kNoError.
|
| + //!
|
| + //! \return The operation status code.
|
| + virtual OperationStatus GetReportForUploading(const UUID& uuid,
|
| + const Report** report) = 0;
|
| +
|
| + //! \brief Adjusts a crash report record’s metadata to account for an upload
|
| + //! attempt.
|
| + //!
|
| + //! After calling this method, the database is permitted to move and rename
|
| + //! the file at Report::file_path.
|
| + //!
|
| + //! \param[in] report The report object obtained from
|
| + //! GetReportForUploading(). This object is invalidated after this call.
|
| + //! \param[in] successful Whether the upload attempt was successful.
|
| + //! \param[in] id The identifier assigned to this crash report by the
|
| + //! collection server. Must be empty if \a successful is `false`; may be
|
| + //! empty if it is `true`.
|
| + //!
|
| + //! \return The operation status code.
|
| + virtual OperationStatus RecordUploadAttempt(const Report* report,
|
| + bool successful,
|
| + const std::string& id) = 0;
|
| +
|
| + //! \brief Moves a report from the pending state to the completed state, but
|
| + //! without the report being uploaded.
|
| + //!
|
| + //! This can be used if the user has disabled crash report collection, but
|
| + //! crash generation is still enabled in the product.
|
| + //!
|
| + //! \param[in] uuid The unique identifier for the crash report record.
|
| + //!
|
| + //! \return The operation status code.
|
| + virtual OperationStatus SkipReportUpload(const UUID& uuid) = 0;
|
| +
|
| + protected:
|
| + CrashReportDatabase() {}
|
| +
|
| + private:
|
| + DISALLOW_COPY_AND_ASSIGN(CrashReportDatabase);
|
| +};
|
| +
|
| +} // namespace crashpad
|
| +
|
| +#endif // CRASHPAD_CLIENT_CRASH_REPORT_DATABASE_H_
|
|
|