MySQL 26.7.0
Source Code Documentation
logger_stream.h
Go to the documentation of this file.
1// Copyright (c) 2026, Oracle and/or its affiliates.
2//
3// This program is free software; you can redistribute it and/or modify
4// it under the terms of the GNU General Public License, version 2.0,
5// as published by the Free Software Foundation.
6//
7// This program is designed to work with certain software (including
8// but not limited to OpenSSL) that is licensed under separate terms,
9// as designated in a particular file or component or in included license
10// documentation. The authors of MySQL hereby grant you an additional
11// permission to link the program and your derivative works with the
12// separately licensed software that they have either included with
13// the program or referenced in the documentation.
14//
15// This program is distributed in the hope that it will be useful,
16// but WITHOUT ANY WARRANTY; without even the implied warranty of
17// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18// GNU General Public License, version 2.0, for more details.
19//
20// You should have received a copy of the GNU General Public License
21// along with this program; if not, write to the Free Software
22// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
23
24#ifndef MYSQL_SCHEDULER_LOGGER_STREAM_H
25#define MYSQL_SCHEDULER_LOGGER_STREAM_H
26
27#include <sstream>
28
29#ifndef STANDALONE_LIBS_MYSQL
30#include "my_dbug.h" // DBUG_PRINT
32#include "mysqld_error.h" // ER_*
33#else
34#include <iostream>
35#endif
36
37/// @brief Message severity levels supported by the server
39
40#ifndef STANDALONE_LIBS_MYSQL
41// default error code: ER_CSA_MSG
42inline constexpr int default_error_code = ER_CSA_MSG;
43#else
44// default error code: 1 (not used)
45inline constexpr int default_error_code = 1;
46#endif // STANDALONE_LIBS_MYSQL
47
48/// @brief Logger utility supporting streaming operator
49template <Severity_level level, int error_code = default_error_code>
51 public:
52 using Stream = std::stringstream;
53
54 /// Gets stream reference
55 /// Stream reference
56 Stream &get_stream() { return m_stream; }
57
58 /// Logs the message
59 void log() {
60#if defined(NDEBUG)
61 if (level == Severity_level::debug) {
62 return;
63 }
64#endif
65#ifndef STANDALONE_LIBS_MYSQL
66 if constexpr (level == Severity_level::warning) {
67 LogErr(WARNING_LEVEL, error_code, m_stream.str().c_str());
68 } else if constexpr (level == Severity_level::error) {
69 LogErr(ERROR_LEVEL, error_code, m_stream.str().c_str());
70 } else if constexpr (level == Severity_level::info) {
71 LogErr(INFORMATION_LEVEL, error_code, m_stream.str().c_str());
72 } else if constexpr (level == Severity_level::debug) {
73 DBUG_PRINT("debug", ("%s", m_stream.str().c_str()));
74 } else {
75 // do nothing
76 }
77#else
78 std::cout << m_stream.str() << std::endl;
79#endif
80 m_stream.clear();
81 }
82 std::stringstream m_stream;
83};
84
85struct Eom {};
86
87template <Severity_level level, int code>
89 Eom &&) {
90 stream.log();
91 return stream;
92}
93
94template <Severity_level level, int code, typename T>
96 T &&arg) {
97 stream.get_stream() << std::forward<T>(arg);
98 return stream;
99}
100
101template <Severity_level level, int code>
103 private:
105
106 public:
110};
111
112template <Severity_level level, int code, typename T>
115 [[maybe_unused]] T &&arg) {
116#if defined(NDEBUG)
117 if (level == Severity_level::debug) {
118 return stream;
119 }
120#endif
121 stream.get() << std::forward<T>(arg);
122 return stream;
123}
124
125#define MYSQL_LIB_LOG_WARN(...) \
126 MYSQL_LIB_LOG_WARN_IMPL(default_error_code, __VA_ARGS__)
127#define MYSQL_LIB_LOG_WARN_IMPL(code, ...) \
128 Logger_stream_inplace<Severity_level::warning, code> {}
129#define MYSQL_LIB_LOG_ERR(...) \
130 MYSQL_LIB_LOG_ERR_IMPL(default_error_code, __VA_ARGS__)
131#define MYSQL_LIB_LOG_ERR_IMPL(code, ...) \
132 Logger_stream_inplace<Severity_level::error, code> {}
133#define MYSQL_LIB_LOG_INFO(...) \
134 MYSQL_LIB_LOG_INFO_IMPL(default_error_code, __VA_ARGS__)
135#define MYSQL_LIB_LOG_INFO_IMPL(code, ...) \
136 Logger_stream_inplace<Severity_level::info, code> {}
137#define MYSQL_LIB_LOG_DEBUG(...) \
138 MYSQL_LIB_LOG_DEBUG_IMPL(default_error_code, __VA_ARGS__)
139#define MYSQL_LIB_LOG_DEBUG_IMPL(code, ...) \
140 Logger_stream_inplace<Severity_level::debug, code> {}
141
142#endif // MYSQL_SCHEDULER_LOGGER_STREAM_H
Definition: logger_stream.h:102
Logger_stream< level, code > m_stream
Definition: logger_stream.h:104
~Logger_stream_inplace()
Definition: logger_stream.h:108
Logger_stream< level, code > & get() const
Definition: logger_stream.h:109
Logger_stream_inplace()=default
Logger utility supporting streaming operator.
Definition: logger_stream.h:50
Stream & get_stream()
Gets stream reference Stream reference.
Definition: logger_stream.h:56
void log()
Logs the message.
Definition: logger_stream.h:59
std::stringstream m_stream
Definition: logger_stream.h:82
std::stringstream Stream
Definition: logger_stream.h:52
#define T
Definition: jit_executor_value.cc:373
Logger_stream< level, code > & operator<<(Logger_stream< level, code > &stream, Eom &&)
Definition: logger_stream.h:88
Severity_level
Message severity levels supported by the server.
Definition: logger_stream.h:38
constexpr int default_error_code
Definition: logger_stream.h:42
#define LogErr(severity, ecode,...)
Definition: log_builtins.h:872
#define DBUG_PRINT(keyword, arglist)
Definition: my_dbug.h:181
@ WARNING_LEVEL
Definition: my_loglevel.h:44
@ ERROR_LEVEL
Definition: my_loglevel.h:43
@ INFORMATION_LEVEL
Definition: my_loglevel.h:45
Definition: logger_stream.h:85