
This CL adds two new histograms that report more details on failed SQLitePersistentStore DB initialization. These new metrics are reported for both instantiations, ReportingAndNEL and Cookie. The first, ErrorInitializeDB is the SQLite error code upon initialization failure and is reported on all platforms. The second, WinGetLastErrorInitializeDB is the ::GetLastError returned on the DB thread after attempting to load the database, and is only reported on Windows. A test is added to verify this behavior, along with verifying that the new histograms are only emitted in the failure case. UmaHistogramSqliteResult is updated to take a const std::string ref to match the underlying UMA functions being called. BUG=1429117 Change-Id: I1bc2c898b005232305cebfde80a0dd8d4cfafd68 Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/4608890 Reviewed-by: Austin Sullivan <asully@chromium.org> Reviewed-by: Chris Fredrickson <cfredric@chromium.org> Commit-Queue: Will Harris <wfh@chromium.org> Cr-Commit-Position: refs/heads/main@{#1157192}
114 lines
4.1 KiB
C++
114 lines
4.1 KiB
C++
// Copyright 2022 The Chromium Authors
|
|
// Use of this source code is governed by a BSD-style license that can be
|
|
// found in the LICENSE file.
|
|
|
|
#ifndef SQL_SQLITE_RESULT_CODE_H_
|
|
#define SQL_SQLITE_RESULT_CODE_H_
|
|
|
|
#include <iosfwd>
|
|
#include <string>
|
|
|
|
#include "base/component_export.h"
|
|
#include "base/dcheck_is_on.h"
|
|
|
|
namespace sql {
|
|
|
|
// Strongly typed enumeration of all known SQLite result codes.
|
|
//
|
|
// The meaning of the codes is listed at https://www.sqlite.org/rescode.html
|
|
//
|
|
// Chrome's SQLite expose SqliteResultCode and SqliteErrorCode instead of plain
|
|
// ints. This isolates the use of sqlite3.h to the SQLite wrapper code itself.
|
|
//
|
|
// The forwarding declaration here is sufficient for most usage. The values are
|
|
// defined in sqlite_result_code_values.h.
|
|
enum class SqliteResultCode : int;
|
|
|
|
// Strongly typed enumeration of all known SQLite error codes.
|
|
//
|
|
// Error codes are a subset of all the result codes. Therefore, every
|
|
// SqliteErrorCode is a valid SqliteResultCode.
|
|
//
|
|
// The forwarding declaration here is sufficient for most usage. The values are
|
|
// defined in sqlite_result_code_values.h.
|
|
enum class SqliteErrorCode : int;
|
|
|
|
// SQLite result codes, mapped into a more compact form for UMA logging.
|
|
//
|
|
// SQLite's (extended) result codes cover a wide range of integer values, and
|
|
// are not suitable for direct use with our UMA logging infrastructure. This
|
|
// enum compresses the range by removing gaps and by mapping multiple SQLite
|
|
// result codes to the same value where appropriate.
|
|
//
|
|
// The forwarding declaration here is sufficient for most headers. The values
|
|
// are defined in sqlite_result_code_values.h.
|
|
enum class SqliteLoggedResultCode : int;
|
|
|
|
// Converts an int returned by SQLite into a strongly typed result code.
|
|
//
|
|
// This method DCHECKs that `sqlite_result_code` is a known SQLite result code.
|
|
#if DCHECK_IS_ON()
|
|
COMPONENT_EXPORT(SQL)
|
|
SqliteResultCode ToSqliteResultCode(int sqlite_result_code);
|
|
#else
|
|
inline SqliteResultCode ToSqliteResultCode(int sqlite_result_code) {
|
|
return static_cast<SqliteResultCode>(sqlite_result_code);
|
|
}
|
|
#endif // DCHECK_IS_ON()
|
|
|
|
// Converts a SqliteResultCode into a SqliteErrorCode.
|
|
//
|
|
// Callers should make sure that `sqlite_result_code` is indeed an error code,
|
|
// and does not indicate success. IsSqliteSuccessCode() could be used for this
|
|
// purpose.
|
|
#if DCHECK_IS_ON()
|
|
COMPONENT_EXPORT(SQL)
|
|
SqliteErrorCode ToSqliteErrorCode(SqliteResultCode sqlite_error_code);
|
|
#else
|
|
inline SqliteErrorCode ToSqliteErrorCode(SqliteResultCode sqlite_error_code) {
|
|
return static_cast<SqliteErrorCode>(sqlite_error_code);
|
|
}
|
|
#endif // DCHECK_IS_ON()
|
|
|
|
// Returns true if `sqlite_result_code` reports a successful operation.
|
|
//
|
|
// `sqlite_result_code` should only be passed to ToSqliteErrorCode() if this
|
|
// function returns false.
|
|
COMPONENT_EXPORT(SQL)
|
|
bool IsSqliteSuccessCode(SqliteResultCode sqlite_result_code);
|
|
|
|
// Helper for logging a SQLite result code to a UMA histogram.
|
|
//
|
|
// The histogram should be declared as enum="SqliteLoggedResultCode".
|
|
//
|
|
// Works for all result codes, including success codes and extended error codes.
|
|
// DCHECKs if provided result code should not occur in Chrome's usage of SQLite.
|
|
COMPONENT_EXPORT(SQL)
|
|
void UmaHistogramSqliteResult(const std::string& histogram_name,
|
|
int sqlite_result_code);
|
|
|
|
// Converts a SQLite result code into a UMA logging-friendly form.
|
|
//
|
|
// Works for all result codes, including success codes and extended error codes.
|
|
// DCHECKs if provided result code should not occur in Chrome's usage of SQLite.
|
|
//
|
|
// UmaHistogramSqliteResult() should be preferred for logging results to UMA.
|
|
COMPONENT_EXPORT(SQL)
|
|
SqliteLoggedResultCode ToSqliteLoggedResultCode(int sqlite_result_code);
|
|
|
|
// Logging support.
|
|
COMPONENT_EXPORT(SQL)
|
|
std::ostream& operator<<(std::ostream& os, SqliteResultCode sqlite_result_code);
|
|
COMPONENT_EXPORT(SQL)
|
|
std::ostream& operator<<(std::ostream& os, SqliteErrorCode sqlite_error_code);
|
|
|
|
// Called by unit tests.
|
|
//
|
|
// DCHECKs the representation invariants of the mapping table used to convert
|
|
// SQLite result codes to logging-friendly values.
|
|
COMPONENT_EXPORT(SQL) void CheckSqliteLoggedResultCodeForTesting();
|
|
|
|
} // namespace sql
|
|
|
|
#endif // SQL_SQLITE_RESULT_CODE_H_
|