| // 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 "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 char* 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_ |