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..318c3c931b8641cff6efa1c5529577ad6c2f25c0 |
--- /dev/null |
+++ b/client/crash_report_database.h |
@@ -0,0 +1,190 @@ |
+// Copyright 2015 The Crashpad Authors. All rights reserved. |
Mark Mentovai
2015/01/08 22:38:09
Top-level question: what do you do about reports t
Robert Sesek
2015/01/13 16:18:22
They can be retrieved with GetReportsNotUploaded()
|
+// |
+// 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/misc/uuid.h" |
+ |
+namespace crashpad { |
+ |
+//! \brief An interface for managing a collection of crash report files and |
+//! metadata associated with the crash reports. |
+//! |
+//! All \a Report objects that are returned by this class are logically const. |
Mark Mentovai
2015/01/08 22:38:09
You don’t need the \a, this gets linked automatica
Robert Sesek
2015/01/13 16:18:22
Done.
|
+//! They are snapshots of the database at the time the query was ran, and the |
Mark Mentovai
2015/01/08 22:38:09
run
Robert Sesek
2015/01/13 16:18:22
Done.
|
+//! data returned is liable to change after the query is executed. |
+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 \a CrashReportDatabase maintains at least this |
Mark Mentovai
2015/01/08 22:38:09
No \a, it gets linked automatically.
Robert Sesek
2015/01/13 16:18:22
Done.
|
+ //! information. |
+ struct Report { |
+ Report() : uuid(), file_path(), id(), uploaded(false), |
Mark Mentovai
2015/01/08 22:38:09
I wouldn’t inline this.
Robert Sesek
2015/01/13 16:18:22
Done.
|
+ last_upload_attempt_time(0), upload_attempts(0) {} |
+ |
+ // A unique identifier by which this report will always be known to the |
Mark Mentovai
2015/01/08 22:38:09
//! doxygen me, throughout this struct.
Looks lik
Robert Sesek
2015/01/13 16:18:22
Done.
|
+ // database. |
+ UUID uuid; |
+ |
+ // The current location of the crash report on the client's filesystem. |
Mark Mentovai
2015/01/08 22:38:09
Your quotes aren’t too smart (but if you find it h
Robert Sesek
2015/01/13 16:18:22
Done.
|
+ // 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; |
+ |
+ // 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 \a uploaded is true, then this timestamp is the time |
Mark Mentovai
2015/01/08 22:38:09
#uploaded
Robert Sesek
2015/01/13 16:18:22
Done.
|
+ // 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 \a |
Mark Mentovai
2015/01/08 22:38:09
#last_upload_attempt_time.
Robert Sesek
2015/01/13 16:18:22
Done.
|
+ // last_upload_attempt_time will be set to the timestamp of the most |
+ // recent attempt. |
+ int upload_attempts; |
+ }; |
+ |
+ //! \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, |
+ }; |
+ |
+ virtual ~CrashReportDatabase() {} |
+ |
+ //! \brief Initializes a database of crash reports. |
+ //! |
+ //! \param[in] path A path to a writable directory, where the database can |
Mark Mentovai
2015/01/08 22:38:09
It’s kinda weird for the interface to take the par
Mark Mentovai
2015/01/08 22:38:09
The database doesn’t have to be a directory as far
Robert Sesek
2015/01/13 16:18:22
No.
Robert Sesek
2015/01/13 16:18:22
I disagree. The caller does not know the structure
|
+ //! be created or opened. |
+ //! |
+ //! \return A database object on success, NULL on failure with an error |
Mark Mentovai
2015/01/08 22:38:09
`nullptr`
Robert Sesek
2015/01/13 16:18:22
Done.
|
+ //! 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 at the file path provided in the |
+ //! record. The file at the Report::file_path will not be created as a result |
+ //! of this call. |
+ //! |
+ //! \param[out] report A crash report record. |
Mark Mentovai
2015/01/08 22:38:09
…only valid if this returns OperationStatus::kNoEr
Robert Sesek
2015/01/13 16:18:22
Done.
|
+ //! |
+ //! \return The operation status code. |
+ virtual OperationStatus PrepareNewCrashReport(Report* 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 Record::file_path. |
+ //! |
+ //! \param[in] uuid The crash report record unique identifier. The identifier |
+ //! must be valid. |
+ //! |
+ //! \return The operation status code. |
+ virtual OperationStatus FinishedWritingCrashReport(const 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. |
+ //! |
+ //! \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. |
Mark Mentovai
2015/01/08 22:38:09
must be empty on entry.
Same for GetUploadedRepor
Robert Sesek
2015/01/13 16:18:22
Done.
|
+ //! |
+ //! \return The operation status code. |
+ virtual OperationStatus GetNotUploadedReports( |
+ std::vector<const Report>* reports) = 0; |
+ |
+ //! \brief Returns a list of crash report records that have been uploaded. |
+ //! |
+ //! \param[out] reports A list of crash report record objects. This must be |
+ //! empty. |
+ //! |
+ //! \return The operation status code. |
+ virtual OperationStatus GetUploadedReports( |
+ std::vector<const Report>* reports) = 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 Record::file_path. |
+ //! |
+ //! \param[in] uuid The unique identifier for the crash report record. The |
+ //! identifier must be valid. |
+ //! \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 UUID& uuid, |
+ bool successful, |
+ const std::string& id) = 0; |
+ |
+ protected: |
+ CrashReportDatabase() {} |
+ |
+ private: |
+ DISALLOW_COPY_AND_ASSIGN(CrashReportDatabase); |
+}; |
+ |
+} // namespace crashpad |
+ |
+#endif // CRASHPAD_CLIENT_CRASH_REPORT_DATABASE_H_ |