diff options
author | Marco Bubke <[email protected]> | 2024-03-18 11:46:21 +0100 |
---|---|---|
committer | Marco Bubke <[email protected]> | 2024-03-20 13:13:18 +0000 |
commit | 99def2c3377a81ee74f0503a9a94958d13fe211b (patch) | |
tree | 77ad2af2c3fdfc82a7fe2046207aa73677482beb | |
parent | 1087375b28604498393d0c3bf8cf81947551765a (diff) |
Sqlite: trace exceptions
That makes it easier to see what got wrong in the trace. So less
debugging.
Change-Id: I26ec3d6a6f81cbd20871260a2b32123343a20618
Reviewed-by: Qt CI Patch Build Bot <[email protected]>
Reviewed-by: Tim Jenssen <[email protected]>
-rw-r--r-- | src/libs/sqlite/CMakeLists.txt | 2 | ||||
-rw-r--r-- | src/libs/sqlite/sqlitebasestatement.cpp | 30 | ||||
-rw-r--r-- | src/libs/sqlite/sqlitebasestatement.h | 19 | ||||
-rw-r--r-- | src/libs/sqlite/sqliteexception.cpp | 30 | ||||
-rw-r--r-- | src/libs/sqlite/sqliteexception.h | 9 | ||||
-rw-r--r-- | src/libs/sqlite/sqlitetracing.cpp | 38 | ||||
-rw-r--r-- | src/libs/sqlite/sqlitetracing.h | 29 |
7 files changed, 103 insertions, 54 deletions
diff --git a/src/libs/sqlite/CMakeLists.txt b/src/libs/sqlite/CMakeLists.txt index 2943d1e77ac..f86f31871a4 100644 --- a/src/libs/sqlite/CMakeLists.txt +++ b/src/libs/sqlite/CMakeLists.txt @@ -58,7 +58,7 @@ add_qtc_library(Sqlite sqlitesessionchangeset.cpp sqlitesessionchangeset.h sqlitesessions.cpp sqlitesessions.h sqlitetable.h - sqlitetransaction.h + sqlitetracing.cpp sqlitetracing.h sqlitetransaction.h sqlitevalue.h sqlitewritestatement.h diff --git a/src/libs/sqlite/sqlitebasestatement.cpp b/src/libs/sqlite/sqlitebasestatement.cpp index 9fa1638d382..c904f3ae3ed 100644 --- a/src/libs/sqlite/sqlitebasestatement.cpp +++ b/src/libs/sqlite/sqlitebasestatement.cpp @@ -26,38 +26,8 @@ extern "C" int sqlite3_carray_bind( namespace Sqlite { -TraceFile &traceFile() -{ - static TraceFile traceFile{"tracing.json"}; - - return traceFile; -} - -namespace { - -thread_local NanotraceHR::EventQueue<NanotraceHR::StringViewWithStringArgumentsTraceEvent, - sqliteTracingStatus()> - eventQueue(traceFile()); - -NanotraceHR::StringViewWithStringArgumentsCategory<sqliteTracingStatus()> &sqliteLowLevelCategory() -{ - thread_local NanotraceHR::StringViewWithStringArgumentsCategory<sqliteTracingStatus()> - sqliteLowLevelCategory_{"sqlite low level"_t, eventQueue, sqliteLowLevelCategory}; - return sqliteLowLevelCategory_; -} - using NanotraceHR::keyValue; -} // namespace - -NanotraceHR::StringViewWithStringArgumentsCategory<sqliteTracingStatus()> &sqliteHighLevelCategory() -{ - thread_local NanotraceHR::StringViewWithStringArgumentsCategory<sqliteTracingStatus()> - sqliteHighLevelCategory_{"sqlite high level"_t, eventQueue, sqliteHighLevelCategory}; - - return sqliteHighLevelCategory_; -} - BaseStatement::BaseStatement(Utils::SmallStringView sqlStatement, Database &database) : m_database(database) { diff --git a/src/libs/sqlite/sqlitebasestatement.h b/src/libs/sqlite/sqlitebasestatement.h index 9f81bfb9e26..81b31473f83 100644 --- a/src/libs/sqlite/sqlitebasestatement.h +++ b/src/libs/sqlite/sqlitebasestatement.h @@ -9,6 +9,7 @@ #include "sqliteblob.h" #include "sqliteexception.h" #include "sqliteids.h" +#include "sqlitetracing.h" #include "sqlitetransaction.h" #include "sqlitevalue.h" @@ -30,8 +31,6 @@ using std::int64_t; namespace Sqlite { -using namespace NanotraceHR::Literals; - class Database; class DatabaseBackend; @@ -44,22 +43,6 @@ constexpr static std::underlying_type_t<Enumeration> to_underlying(Enumeration e return static_cast<std::underlying_type_t<Enumeration>>(enumeration); } -constexpr NanotraceHR::Tracing sqliteTracingStatus() -{ -#ifdef ENABLE_SQLITE_TRACING - return NanotraceHR::Tracing::IsEnabled; -#else - return NanotraceHR::Tracing::IsDisabled; -#endif -} - -using TraceFile = NanotraceHR::TraceFile<sqliteTracingStatus()>; - -SQLITE_EXPORT TraceFile &traceFile(); - -SQLITE_EXPORT NanotraceHR::StringViewWithStringArgumentsCategory<sqliteTracingStatus()> & -sqliteHighLevelCategory(); - class SQLITE_EXPORT BaseStatement { public: diff --git a/src/libs/sqlite/sqliteexception.cpp b/src/libs/sqlite/sqliteexception.cpp index b5f581ad685..bb4a474adb0 100644 --- a/src/libs/sqlite/sqliteexception.cpp +++ b/src/libs/sqlite/sqliteexception.cpp @@ -3,14 +3,20 @@ #include "sqliteexception.h" +#include "sqlitetracing.h" + #include <utils/smallstringio.h> +#include <nanotrace/nanotracehr.h> + #include <sqlite.h> #include <QDebug> namespace Sqlite { +using NanotraceHR::keyValue; + const char *Exception::what() const noexcept { return "Sqlite::Exception"; @@ -18,7 +24,10 @@ const char *Exception::what() const noexcept const char *ExceptionWithMessage::what() const noexcept { - return "Sqlite::ExceptionWithMessage"; + static Utils::SmallString text = Utils::SmallString::join( + {"Sqlite::ExceptionWithMessage", m_sqliteErrorMessage}); + + return text.data(); } void ExceptionWithMessage::printWarning() const @@ -26,6 +35,13 @@ void ExceptionWithMessage::printWarning() const qWarning() << what() << m_sqliteErrorMessage; } +StatementIsBusy::StatementIsBusy(Utils::SmallString &&sqliteErrorMessage) + : ExceptionWithMessage{std::move(sqliteErrorMessage)} +{ + sqliteHighLevelCategory().threadEvent("StatementIsBusy"_t, + keyValue("error message", std::string_view{what()})); +} + const char *StatementIsBusy::what() const noexcept { return "Sqlite::StatementIsBusy"; @@ -36,9 +52,19 @@ const char *DatabaseIsBusy::what() const noexcept return "Sqlite::DatabaseIsBusy"; } +StatementHasError::StatementHasError(Utils::SmallString &&sqliteErrorMessage) + : ExceptionWithMessage{std::move(sqliteErrorMessage)} +{ + sqliteHighLevelCategory().threadEvent("StatementHasError"_t, + keyValue("error message", std::string_view{what()})); +} + const char *StatementHasError::what() const noexcept { - return "Sqlite::StatementHasError"; + static Utils::SmallString text = Utils::SmallString::join( + {"Sqlite::StatementHasError: ", message()}); + + return text.data(); } const char *StatementIsMisused::what() const noexcept diff --git a/src/libs/sqlite/sqliteexception.h b/src/libs/sqlite/sqliteexception.h index f0cadfc7483..17a0639e19f 100644 --- a/src/libs/sqlite/sqliteexception.h +++ b/src/libs/sqlite/sqliteexception.h @@ -23,13 +23,15 @@ public: class SQLITE_EXPORT ExceptionWithMessage : public Exception { public: - ExceptionWithMessage(Utils::SmallString &&sqliteErrorMessage = Utils::SmallString{}) + ExceptionWithMessage(Utils::SmallString &&sqliteErrorMessage = {}) : m_sqliteErrorMessage(std::move(sqliteErrorMessage)) {} const char *what() const noexcept override; void printWarning() const; + std::string_view message() const noexcept { return m_sqliteErrorMessage; } + private: Utils::SmallString m_sqliteErrorMessage; }; @@ -37,7 +39,7 @@ private: class SQLITE_EXPORT StatementIsBusy : public ExceptionWithMessage { public: - using ExceptionWithMessage::ExceptionWithMessage; + StatementIsBusy(Utils::SmallString &&sqliteErrorMessage); const char *what() const noexcept override; }; @@ -90,7 +92,8 @@ public: class SQLITE_EXPORT StatementHasError : public ExceptionWithMessage { public: - using ExceptionWithMessage::ExceptionWithMessage; + StatementHasError(Utils::SmallString &&sqliteErrorMessage); + const char *what() const noexcept override; }; diff --git a/src/libs/sqlite/sqlitetracing.cpp b/src/libs/sqlite/sqlitetracing.cpp new file mode 100644 index 00000000000..700546f1467 --- /dev/null +++ b/src/libs/sqlite/sqlitetracing.cpp @@ -0,0 +1,38 @@ +// Copyright (C) 2024 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0 + +#include "sqlitetracing.h" + +namespace Sqlite { + +TraceFile &traceFile() +{ + static TraceFile traceFile{"tracing.json"}; + + return traceFile; +} + +namespace { + +thread_local NanotraceHR::EventQueue<NanotraceHR::StringViewWithStringArgumentsTraceEvent, + sqliteTracingStatus()> + eventQueue(traceFile()); + +} // namespace + +NanotraceHR::StringViewWithStringArgumentsCategory<sqliteTracingStatus()> &sqliteLowLevelCategory() +{ + thread_local NanotraceHR::StringViewWithStringArgumentsCategory<sqliteTracingStatus()> + sqliteLowLevelCategory_{"sqlite low level"_t, eventQueue, sqliteLowLevelCategory}; + return sqliteLowLevelCategory_; +} + +NanotraceHR::StringViewWithStringArgumentsCategory<sqliteTracingStatus()> &sqliteHighLevelCategory() +{ + thread_local NanotraceHR::StringViewWithStringArgumentsCategory<sqliteTracingStatus()> + sqliteHighLevelCategory_{"sqlite high level"_t, eventQueue, sqliteHighLevelCategory}; + + return sqliteHighLevelCategory_; +} + +} // namespace Sqlite diff --git a/src/libs/sqlite/sqlitetracing.h b/src/libs/sqlite/sqlitetracing.h new file mode 100644 index 00000000000..8dadc6de0db --- /dev/null +++ b/src/libs/sqlite/sqlitetracing.h @@ -0,0 +1,29 @@ +// Copyright (C) 2024 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0 + +#include "sqliteglobal.h" + +#include <nanotrace/nanotracehr.h> + +namespace Sqlite { +using namespace NanotraceHR::Literals; + +constexpr NanotraceHR::Tracing sqliteTracingStatus() +{ +#ifdef ENABLE_SQLITE_TRACING + return NanotraceHR::Tracing::IsEnabled; +#else + return NanotraceHR::Tracing::IsDisabled; +#endif +} + +using TraceFile = NanotraceHR::TraceFile<sqliteTracingStatus()>; + +SQLITE_EXPORT TraceFile &traceFile(); + +NanotraceHR::StringViewWithStringArgumentsCategory<sqliteTracingStatus()> &sqliteLowLevelCategory(); + +SQLITE_EXPORT NanotraceHR::StringViewWithStringArgumentsCategory<sqliteTracingStatus()> & +sqliteHighLevelCategory(); + +} // namespace Sqlite |