MySQL 8.4.0
Source Code Documentation
sql_plugin.h
Go to the documentation of this file.
1/* Copyright (c) 2005, 2024, 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 _sql_plugin_h
25#define _sql_plugin_h
26
27#include <stddef.h>
28#include <sys/types.h>
29#include <vector>
30
31#include "lex_string.h"
32#include "my_io.h"
33#include "my_sqlcommand.h" // enum_sql_command
35#include "sql/sql_cmd.h" // Sql_cmd
36#include "sql/sql_plugin_ref.h" // plugin_ref
37
38class THD;
39class i_string;
40struct MEM_ROOT;
41struct SYS_VAR;
42struct my_option;
43template <class T>
44class I_List;
45
46extern const char *global_plugin_typelib_names[];
49
50#ifdef NDEBUG
51#define plugin_ref_to_int(A) A
52#define plugin_int_to_ref(A) A
53#else
54#define plugin_ref_to_int(A) (A ? A[0] : NULL)
55#define plugin_int_to_ref(A) &(A)
56#endif
57
58/*
59 the following flags are valid for plugin_init()
60*/
61#define PLUGIN_INIT_SKIP_DYNAMIC_LOADING 1
62#define PLUGIN_INIT_SKIP_PLUGIN_TABLE 2
63#define PLUGIN_INIT_SKIP_INITIALIZATION 4
64#define PLUGIN_INIT_DELAY_UNTIL_AFTER_UPGRADE 8
65
66#define MYSQL_ANY_PLUGIN -1
67
68/*
69 different values of st_plugin_int::state
70 though they look like a bitmap, plugin may only
71 be in one of those eigenstates, not in a superposition of them :)
72 It's a bitmap, because it makes it easier to test
73 "whether the state is one of those..."
74*/
75#define PLUGIN_IS_FREED 1
76#define PLUGIN_IS_DELETED 2
77#define PLUGIN_IS_UNINITIALIZED 4
78#define PLUGIN_IS_READY 8
79#define PLUGIN_IS_DYING 16
80#define PLUGIN_IS_DISABLED 32
81#define PLUGIN_IS_WAITING_FOR_UPGRADE 64
82
83/* A handle for the dynamic library containing a plugin or plugins. */
84
87 void *handle;
90 uint ref_count; /* number of plugins loaded from the library */
91};
92
93/**
94 This class implements the INSTALL PLUGIN statement.
95*/
96
98 public:
100 : m_comment(comment), m_ident(ident) {}
101
104 }
105
106 /**
107 Install a new plugin by inserting a row into the
108 mysql.plugin table, creating a cache entry and
109 initializing plugin's internal data.
110
111 @param thd Thread context
112
113 @returns false if success, true otherwise
114 */
115 bool execute(THD *thd) override;
116
117 private:
120};
121
122/**
123 This class implements the UNINSTALL PLUGIN statement.
124*/
125
127 public:
129 : m_comment(comment) {}
130
133 }
134
135 /**
136 Uninstall a plugin by removing a row from the
137 mysql.plugin table, deleting a cache entry and
138 deinitializing plugin's internal data.
139
140 @param thd Thread context
141
142 @returns false if success, true otherwise
143 */
144 bool execute(THD *thd) override;
145
146 private:
148};
149
150typedef int (*plugin_type_init)(struct st_plugin_int *);
151
154extern char *opt_plugin_dir_ptr;
155extern char opt_plugin_dir[FN_REFLEN];
156extern const LEX_CSTRING plugin_type_names[];
157
158extern bool plugin_register_early_plugins(int *argc, char **argv, int flags);
159extern bool plugin_register_builtin_and_init_core_se(int *argc, char **argv);
160extern bool plugin_register_dynamic_and_init_all(int *argc, char **argv,
161 int init_flags);
162extern bool update_persisted_plugin_sysvars(const char *name);
163
164namespace dd {
165namespace upgrade {
167}
168} // namespace dd
169
171extern void plugin_shutdown(void);
172void add_plugin_options(std::vector<my_option> *options, MEM_ROOT *mem_root);
173extern bool plugin_is_ready(const LEX_CSTRING &name, int type);
174#define my_plugin_lock_by_name(A, B, C) plugin_lock_by_name(A, B, C)
175#define my_plugin_lock_by_name_ci(A, B, C) plugin_lock_by_name(A, B, C)
176#define my_plugin_lock(A, B) plugin_lock(A, B)
177#define my_plugin_lock_ci(A, B) plugin_lock(A, B)
178extern plugin_ref plugin_lock(THD *thd, plugin_ref *ptr);
180 int type);
181extern void plugin_unlock(THD *thd, plugin_ref plugin);
182extern void plugin_unlock_list(THD *thd, plugin_ref *list, size_t count);
183extern void plugin_thdvar_init(THD *thd, bool enable_plugins);
184extern void plugin_thdvar_cleanup(THD *thd, bool enable_plugins);
185extern void plugin_thdvar_safe_update(THD *thd, SYS_VAR *var, char **dest,
186 const char *value);
187extern bool check_valid_path(const char *path, size_t length);
188extern void alloc_and_copy_thd_dynamic_variables(THD *thd, bool global_lock);
189
190typedef bool(plugin_foreach_func)(THD *thd, plugin_ref plugin, void *arg);
191#define plugin_foreach(A, B, C, D) \
192 plugin_foreach_with_mask(A, B, C, PLUGIN_IS_READY, D)
193extern bool plugin_foreach_with_mask(THD *thd, plugin_foreach_func *func,
194 int type, uint state_mask, void *arg);
195extern bool plugin_foreach_with_mask(THD *thd, plugin_foreach_func **funcs,
196 int type, uint state_mask, void *arg);
197bool end_transaction(THD *thd, bool error);
198
199/**
200 Initialize one plugin.
201*/
202bool plugin_early_load_one(int *argc, char **argv, const char *plugin);
203
204#endif
Definition: sql_list.h:844
This class implements the INSTALL PLUGIN statement.
Definition: sql_plugin.h:97
bool execute(THD *thd) override
Install a new plugin by inserting a row into the mysql.plugin table, creating a cache entry and initi...
Definition: sql_plugin.cc:3675
enum_sql_command sql_command_code() const override
Return the command code for this statement.
Definition: sql_plugin.h:102
LEX_STRING m_ident
Definition: sql_plugin.h:119
LEX_CSTRING m_comment
Definition: sql_plugin.h:118
Sql_cmd_install_plugin(const LEX_CSTRING &comment, const LEX_STRING &ident)
Definition: sql_plugin.h:99
This class implements the UNINSTALL PLUGIN statement.
Definition: sql_plugin.h:126
Sql_cmd_uninstall_plugin(const LEX_CSTRING &comment)
Definition: sql_plugin.h:128
enum_sql_command sql_command_code() const override
Return the command code for this statement.
Definition: sql_plugin.h:131
LEX_CSTRING m_comment
Definition: sql_plugin.h:147
bool execute(THD *thd) override
Uninstall a plugin by removing a row from the mysql.plugin table, deleting a cache entry and deinitia...
Definition: sql_plugin.cc:3682
Representation of an SQL command.
Definition: sql_cmd.h:83
For each client connection we create a separate thread with THD serving as a thread/connection descri...
Definition: sql_lexer_thd.h:36
Definition: sql_list.h:731
static MEM_ROOT mem_root
Definition: client_plugin.cc:114
static int flags[50]
Definition: hp_test1.cc:40
#define comment
Definition: lexyy.cc:959
Common #defines and includes for file and socket I/O.
#define FN_REFLEN
Definition: my_io.h:83
enum_sql_command
Definition: my_sqlcommand.h:46
@ SQLCOM_INSTALL_PLUGIN
Definition: my_sqlcommand.h:162
@ SQLCOM_UNINSTALL_PLUGIN
Definition: my_sqlcommand.h:163
static int count
Definition: myisam_ftdump.cc:45
ABI for instrumented mutexes.
void error(const char *format,...)
static char * path
Definition: mysqldump.cc:149
bool plugin_initialize_delayed_after_upgrade()
Initialize delayed plugins.
Definition: sql_plugin.cc:1710
The version of the current data dictionary table definitions.
Definition: dictionary_client.h:43
bool length(const dd::Spatial_reference_system *srs, const Geometry *g1, double *length, bool *null) noexcept
Computes the length of linestrings and multilinestrings.
Definition: length.cc:76
Definition: options.cc:57
std::list< T, ut::allocator< T > > list
Specialization of list which uses ut_allocator.
Definition: ut0new.h:2878
required string type
Definition: replication_group_member_actions.proto:34
Representation of an SQL command.
bool plugin_early_load_one(int *argc, char **argv, const char *plugin)
Initialize one plugin.
Definition: sql_plugin.cc:2215
void plugin_unlock(THD *thd, plugin_ref plugin)
Definition: sql_plugin.cc:1263
void alloc_and_copy_thd_dynamic_variables(THD *thd, bool global_lock)
Allocate memory and copy dynamic variables from global system variables to per-thread system variable...
Definition: sql_plugin.cc:2902
void plugin_thdvar_init(THD *thd, bool enable_plugins)
Definition: sql_plugin.cc:3008
char * opt_plugin_dir_ptr
Definition: sql_plugin.cc:344
void plugin_thdvar_cleanup(THD *thd, bool enable_plugins)
Definition: sql_plugin.cc:3081
bool is_builtin_and_core_se_initialized()
Definition: sql_plugin.cc:1689
plugin_ref plugin_lock(THD *thd, plugin_ref *ptr)
Definition: sql_plugin.cc:984
int(* plugin_type_init)(struct st_plugin_int *)
Definition: sql_plugin.h:150
mysql_mutex_t LOCK_plugin
Serializes access to the global plugin memory list.
Definition: sql_plugin.cc:450
const LEX_CSTRING plugin_type_names[]
Definition: sql_plugin.cc:350
bool check_valid_path(const char *path, size_t length)
Check if the provided path is valid in the sense that it does cause a relative reference outside the ...
Definition: sql_plugin.cc:571
const char * global_plugin_typelib_names[]
Definition: sql_plugin.cc:334
bool plugin_register_dynamic_and_init_all(int *argc, char **argv, int init_flags)
Register and initialize the dynamic plugins.
Definition: sql_plugin.cc:1779
bool plugin_register_builtin_and_init_core_se(int *argc, char **argv)
Register the builtin plugins.
Definition: sql_plugin.cc:1556
bool() plugin_foreach_func(THD *thd, plugin_ref plugin, void *arg)
Definition: sql_plugin.h:190
void plugin_unlock_list(THD *thd, plugin_ref *list, size_t count)
Definition: sql_plugin.cc:1277
void add_plugin_options(std::vector< my_option > *options, MEM_ROOT *mem_root)
Definition: sql_plugin.cc:3643
char opt_plugin_dir[FN_REFLEN]
Definition: sql_plugin.cc:345
I_List< i_string > * opt_early_plugin_load_list_ptr
Definition: sql_plugin.cc:343
void plugin_thdvar_safe_update(THD *thd, SYS_VAR *var, char **dest, const char *value)
Set value for a thread local variable.
Definition: sql_plugin.cc:3144
bool end_transaction(THD *thd, bool error)
Definition: sql_plugin.cc:2188
plugin_ref plugin_lock_by_name(THD *thd, const LEX_CSTRING &name, int type)
Definition: sql_plugin.cc:994
bool plugin_is_ready(const LEX_CSTRING &name, int type)
Definition: sql_plugin.cc:934
bool plugin_register_early_plugins(int *argc, char **argv, int flags)
Register and initialize early plugins.
Definition: sql_plugin.cc:1501
mysql_mutex_t LOCK_plugin_delete
Definition: sql_plugin.cc:439
bool update_persisted_plugin_sysvars(const char *name)
Update read-write persisted plugin system variables.
Definition: sql_plugin.cc:1534
I_List< i_string > * opt_plugin_load_list_ptr
Definition: sql_plugin.cc:341
void plugin_shutdown(void)
Definition: sql_plugin.cc:2042
bool plugin_foreach_with_mask(THD *thd, plugin_foreach_func *func, int type, uint state_mask, void *arg)
Definition: sql_plugin.cc:2762
case opt name
Definition: sslopt-case.h:29
The MEM_ROOT is a simple arena, where allocations are carved out of larger blocks.
Definition: my_alloc.h:83
Definition: mysql_lex_string.h:40
Definition: mysql_lex_string.h:35
Definition: plugin.h:69
Definition: my_getopt.h:93
An instrumented mutex structure.
Definition: mysql_mutex_bits.h:50
Definition: plugin.h:635
Definition: sql_plugin.h:85
LEX_STRING dl
Definition: sql_plugin.h:86
void * handle
Definition: sql_plugin.h:87
int version
Definition: sql_plugin.h:89
struct st_mysql_plugin * plugins
Definition: sql_plugin.h:88
uint ref_count
Definition: sql_plugin.h:90
Definition: sql_plugin_ref.h:45