mysql-server/sql/server_component/log_builtins_internal.h
2025-03-05 14:31:37 +07:00

151 lines
5.4 KiB
C

/* Copyright (c) 2020, 2024, Oracle and/or its affiliates.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License, version 2.0,
as published by the Free Software Foundation.
This program is designed to work with certain software (including
but not limited to OpenSSL) that is licensed under separate terms,
as designated in a particular file or component or in included license
documentation. The authors of MySQL hereby grant you an additional
permission to link the program and your derivative works with the
separately licensed software that they have either included with
the program or referenced in the documentation.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License, version 2.0, for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */
/*
This file contains private definitions for use within the logger,
but not by loadable logging components or code that uses the logger
but is not part of the logger.
*/
#ifndef LOG_BUILTINS_DATA_H
#define LOG_BUILTINS_DATA_H
#include <mysql/components/services/log_builtins_filter.h>
#include <mysql/components/services/log_service.h>
#include <mysql/components/services/log_shared.h> // public data types
/**
When the logger-core was initialized.
@retval 0 logger-core is not currently available
@retval >0 time (micro-seconds since the epoch) the logger became available
*/
extern ulonglong log_builtins_started();
/**
MySQL server's default log-processor.
Apply all components (filters, sinks, ...) in the log stack to a given event.
@param ll the log-event to process
@retval true failure
@retval false success
*/
extern bool log_line_error_stack_run(log_line *ll);
/**
Finding and acquiring a service in the component framework is
expensive, and we may use services a log (depending on how many
events are logged per second), so we cache the relevant data.
This struct describes a given service.
*/
struct log_service_cache_entry {
char *name; ///< name of this service
size_t name_len; ///< service-name's length
char *urn; ///< URN of loaded if implicitly loaded, or NULL
my_h_service service; ///< handle (service framework)
int opened; ///< currently open instances
int requested; ///< requested instances
int chistics; ///< multi-open supported, etc.
};
/**
State of a given instance of a service. A service may support being
opened several times.
*/
typedef struct _log_service_instance {
log_service_cache_entry *sce; ///< the service in question
void *instance; ///< instance handle (multi-open)
struct _log_service_instance *next; ///< next instance (any service)
} log_service_instance;
extern log_service_instance *log_service_instances; ///< anchor
extern log_service_instance *log_sink_pfs_source; ///< log-reader
/**
Maximum number of key/value pairs in a log event.
May be changed or abolished later.
*/
#define LOG_ITEM_MAX 64
/**
Iterator over the key/value pairs of a log_line.
At present, only one iter may exist per log_line.
*/
typedef struct _log_item_iter {
struct _log_line *ll; ///< log_line this is the iter for
int index; ///< index of current key/value pair
} log_item_iter;
/**
log_line ("log event")
*/
typedef struct _log_line {
log_item_type_mask seen; ///< bit field flagging item-types contained
log_item_iter iter; ///< iterator over key/value pairs
log_item output_buffer; ///< buffer a service can return its output in
int count; ///< number of key/value pairs ("log items")
log_item item[LOG_ITEM_MAX]; ///< log items
} log_line;
extern log_filter_ruleset *log_filter_builtin_rules; // what it says on the tin
/**
Create a log-file name (path + name + extension).
The path will be taken from @@log_error.
If name + extension are given, they are used.
If only an extension is given (argument starts with '.'),
the name is taken from @@log_error, and the extension is used.
If only a name is given (but no extension), the name and a
default extension are used.
@param result Buffer to return to created path+name+extension in.
Size must be FN_REFLEN.
@param name_or_ext if beginning with '.':
@@global.log_error, except with this extension
otherwise:
use this as file name in the same location as
@@global.log_error
Value may not contain folder separators!
@retval LOG_SERVICE_SUCCESS buffer contains a valid result
@retval LOG_SERVICE_BUFFER_SIZE_INSUFFICIENT an error occurred
*/
log_service_error make_log_path(char *result, const char *name_or_ext);
/**
Acquire an exclusive lock on the error logger core.
Used e.g. to pause all logging while the previous run's
log is read to performance_schema.error_log.
*/
void log_builtins_error_stack_wrlock();
/**
Release a lock on the error logger core.
*/
void log_builtins_error_stack_unlock();
#endif /* LOG_BUILTINS_DATA_H */