MySQL  8.0.27
Source Code Documentation
sql_plugin.h
Go to the documentation of this file.
1 /* Copyright (c) 2005, 2021, 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 also distributed 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 included with MySQL.
13 
14  This program is distributed in the hope that it will be useful,
15  but WITHOUT ANY WARRANTY; without even the implied warranty of
16  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17  GNU General Public License, version 2.0, for more details.
18 
19  You should have received a copy of the GNU General Public License
20  along with this program; if not, write to the Free Software
21  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */
22 
23 #ifndef _sql_plugin_h
24 #define _sql_plugin_h
25 
26 #include <stddef.h>
27 #include <sys/types.h>
28 #include <vector>
29 
30 #include "lex_string.h"
31 #include "my_io.h"
32 #include "my_sqlcommand.h" // enum_sql_command
34 #include "sql/sql_cmd.h" // Sql_cmd
35 #include "sql/sql_plugin_ref.h" // plugin_ref
36 
37 class THD;
38 class i_string;
39 struct MEM_ROOT;
40 struct SYS_VAR;
41 struct my_option;
42 template <class T>
43 class I_List;
44 
45 extern const char *global_plugin_typelib_names[];
48 
49 #ifdef NDEBUG
50 #define plugin_ref_to_int(A) A
51 #define plugin_int_to_ref(A) A
52 #else
53 #define plugin_ref_to_int(A) (A ? A[0] : NULL)
54 #define plugin_int_to_ref(A) &(A)
55 #endif
56 
57 /*
58  the following flags are valid for plugin_init()
59 */
60 #define PLUGIN_INIT_SKIP_DYNAMIC_LOADING 1
61 #define PLUGIN_INIT_SKIP_PLUGIN_TABLE 2
62 #define PLUGIN_INIT_SKIP_INITIALIZATION 4
63 #define PLUGIN_INIT_DELAY_UNTIL_AFTER_UPGRADE 8
64 
65 #define MYSQL_ANY_PLUGIN -1
66 
67 /*
68  different values of st_plugin_int::state
69  though they look like a bitmap, plugin may only
70  be in one of those eigenstates, not in a superposition of them :)
71  It's a bitmap, because it makes it easier to test
72  "whether the state is one of those..."
73 */
74 #define PLUGIN_IS_FREED 1
75 #define PLUGIN_IS_DELETED 2
76 #define PLUGIN_IS_UNINITIALIZED 4
77 #define PLUGIN_IS_READY 8
78 #define PLUGIN_IS_DYING 16
79 #define PLUGIN_IS_DISABLED 32
80 #define PLUGIN_IS_WAITING_FOR_UPGRADE 64
81 
82 /* A handle for the dynamic library containing a plugin or plugins. */
83 
84 struct st_plugin_dl {
86  void *handle;
88  int version;
89  uint ref_count; /* number of plugins loaded from the library */
90 };
91 
92 /**
93  This class implements the INSTALL PLUGIN statement.
94 */
95 
97  public:
99  : m_comment(comment), m_ident(ident) {}
100 
102  return SQLCOM_INSTALL_PLUGIN;
103  }
104 
105  /**
106  Install a new plugin by inserting a row into the
107  mysql.plugin table, creating a cache entry and
108  initializing plugin's internal data.
109 
110  @param thd Thread context
111 
112  @returns false if success, true otherwise
113  */
114  bool execute(THD *thd) override;
115 
116  private:
119 };
120 
121 /**
122  This class implements the UNINSTALL PLUGIN statement.
123 */
124 
126  public:
128  : m_comment(comment) {}
129 
132  }
133 
134  /**
135  Uninstall a plugin by removing a row from the
136  mysql.plugin table, deleting a cache entry and
137  deinitializing plugin's internal data.
138 
139  @param thd Thread context
140 
141  @returns false if success, true otherwise
142  */
143  bool execute(THD *thd) override;
144 
145  private:
147 };
148 
149 typedef int (*plugin_type_init)(struct st_plugin_int *);
150 
153 extern char *opt_plugin_dir_ptr;
154 extern char opt_plugin_dir[FN_REFLEN];
155 extern const LEX_CSTRING plugin_type_names[];
156 
157 extern bool plugin_register_early_plugins(int *argc, char **argv, int flags);
158 extern bool plugin_register_builtin_and_init_core_se(int *argc, char **argv);
159 extern bool plugin_register_dynamic_and_init_all(int *argc, char **argv,
160  int init_flags);
161 
162 namespace dd {
163 namespace upgrade {
165 }
166 } // namespace dd
167 
169 extern void plugin_shutdown(void);
170 extern void memcached_shutdown(void);
171 void add_plugin_options(std::vector<my_option> *options, MEM_ROOT *mem_root);
172 extern bool plugin_is_ready(const LEX_CSTRING &name, int type);
173 #define my_plugin_lock_by_name(A, B, C) plugin_lock_by_name(A, B, C)
174 #define my_plugin_lock_by_name_ci(A, B, C) plugin_lock_by_name(A, B, C)
175 #define my_plugin_lock(A, B) plugin_lock(A, B)
176 #define my_plugin_lock_ci(A, B) plugin_lock(A, B)
177 extern plugin_ref plugin_lock(THD *thd, plugin_ref *ptr);
179  int type);
180 extern void plugin_unlock(THD *thd, plugin_ref plugin);
181 extern void plugin_unlock_list(THD *thd, plugin_ref *list, size_t count);
182 extern void plugin_thdvar_init(THD *thd, bool enable_plugins);
183 extern void plugin_thdvar_cleanup(THD *thd, bool enable_plugins);
184 extern void plugin_thdvar_safe_update(THD *thd, SYS_VAR *var, char **dest,
185  const char *value);
186 extern bool check_valid_path(const char *path, size_t length);
187 extern void alloc_and_copy_thd_dynamic_variables(THD *thd, bool global_lock);
188 
189 typedef bool(plugin_foreach_func)(THD *thd, plugin_ref plugin, void *arg);
190 #define plugin_foreach(A, B, C, D) \
191  plugin_foreach_with_mask(A, B, C, PLUGIN_IS_READY, D)
192 extern bool plugin_foreach_with_mask(THD *thd, plugin_foreach_func *func,
193  int type, uint state_mask, void *arg);
194 extern bool plugin_foreach_with_mask(THD *thd, plugin_foreach_func **funcs,
195  int type, uint state_mask, void *arg);
196 int lock_plugin_data();
197 int unlock_plugin_data();
198 
199 bool end_transaction(THD *thd, bool error);
200 
201 /**
202  Initialize one plugin.
203 */
204 bool plugin_early_load_one(int *argc, char **argv, const char *plugin);
205 
206 #endif
Definition: sql_list.h:805
This class implements the INSTALL PLUGIN statement.
Definition: sql_plugin.h:96
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:3723
enum_sql_command sql_command_code() const override
Return the command code for this statement.
Definition: sql_plugin.h:101
LEX_STRING m_ident
Definition: sql_plugin.h:118
LEX_CSTRING m_comment
Definition: sql_plugin.h:117
Sql_cmd_install_plugin(const LEX_CSTRING &comment, const LEX_STRING &ident)
Definition: sql_plugin.h:98
This class implements the UNINSTALL PLUGIN statement.
Definition: sql_plugin.h:125
Sql_cmd_uninstall_plugin(const LEX_CSTRING &comment)
Definition: sql_plugin.h:127
enum_sql_command sql_command_code() const override
Return the command code for this statement.
Definition: sql_plugin.h:130
LEX_CSTRING m_comment
Definition: sql_plugin.h:146
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:3730
Representation of an SQL command.
Definition: sql_cmd.h:64
For each client connection we create a separate thread with THD serving as a thread/connection descri...
Definition: sql_class.h:821
Definition: sql_list.h:692
static MEM_ROOT mem_root
Definition: client_plugin.cc:109
char * argv[]
Definition: do_ctype.cc:45
get_options & argc
Definition: do_ctype.cc:51
static int flags[50]
Definition: hp_test1.cc:39
#define comment
Definition: lexyy.cc:959
Common #defines and includes for file and socket I/O.
#define FN_REFLEN
Definition: my_io.h:82
enum_sql_command
Definition: my_sqlcommand.h:45
@ SQLCOM_INSTALL_PLUGIN
Definition: my_sqlcommand.h:161
@ SQLCOM_UNINSTALL_PLUGIN
Definition: my_sqlcommand.h:162
static int count
Definition: myisam_ftdump.cc:42
ABI for instrumented mutexes.
Log error(cerr, "ERROR")
static char * path
Definition: mysqldump.cc:130
bool plugin_initialize_delayed_after_upgrade()
Initialize delayed plugins.
Definition: sql_plugin.cc:1650
The version of the current data dictionary table definitions.
Definition: dictionary_client.h:42
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:75
Definition: options.cc:45
const string value("\"Value\"")
required string type
Definition: replication_group_member_actions.proto:33
Representation of an SQL command.
bool plugin_early_load_one(int *argc, char **argv, const char *plugin)
Initialize one plugin.
Definition: sql_plugin.cc:2168
void plugin_unlock(THD *thd, plugin_ref plugin)
Definition: sql_plugin.cc:1244
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:2928
void plugin_thdvar_init(THD *thd, bool enable_plugins)
Definition: sql_plugin.cc:3032
char * opt_plugin_dir_ptr
Definition: sql_plugin.cc:339
void plugin_thdvar_cleanup(THD *thd, bool enable_plugins)
Definition: sql_plugin.cc:3105
bool is_builtin_and_core_se_initialized()
Definition: sql_plugin.cc:1629
plugin_ref plugin_lock(THD *thd, plugin_ref *ptr)
Definition: sql_plugin.cc:970
int(* plugin_type_init)(struct st_plugin_int *)
Definition: sql_plugin.h:149
int lock_plugin_data()
Locks the plugin strucutres so calls to plugin_find_inner can be issued.
Definition: sql_plugin.cc:3710
mysql_mutex_t LOCK_plugin
Serializes access to the global plugin memory list.
Definition: sql_plugin.cc:447
const LEX_CSTRING plugin_type_names[]
Definition: sql_plugin.cc:345
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:569
const char * global_plugin_typelib_names[]
Definition: sql_plugin.cc:329
bool plugin_register_dynamic_and_init_all(int *argc, char **argv, int init_flags)
Register and initialize the dynamic plugins.
Definition: sql_plugin.cc:1719
bool plugin_register_builtin_and_init_core_se(int *argc, char **argv)
Register the builtin plugins.
Definition: sql_plugin.cc:1516
bool() plugin_foreach_func(THD *thd, plugin_ref plugin, void *arg)
Definition: sql_plugin.h:189
void plugin_unlock_list(THD *thd, plugin_ref *list, size_t count)
Definition: sql_plugin.cc:1258
void add_plugin_options(std::vector< my_option > *options, MEM_ROOT *mem_root)
Definition: sql_plugin.cc:3673
char opt_plugin_dir[FN_REFLEN]
Definition: sql_plugin.cc:340
I_List< i_string > * opt_early_plugin_load_list_ptr
Definition: sql_plugin.cc:338
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:3167
void memcached_shutdown(void)
Definition: sql_plugin.cc:1981
bool end_transaction(THD *thd, bool error)
Definition: sql_plugin.cc:2141
plugin_ref plugin_lock_by_name(THD *thd, const LEX_CSTRING &name, int type)
Definition: sql_plugin.cc:980
bool plugin_is_ready(const LEX_CSTRING &name, int type)
Definition: sql_plugin.cc:925
bool plugin_register_early_plugins(int *argc, char **argv, int flags)
Register and initialize early plugins.
Definition: sql_plugin.cc:1481
mysql_mutex_t LOCK_plugin_delete
Definition: sql_plugin.cc:436
I_List< i_string > * opt_plugin_load_list_ptr
Definition: sql_plugin.cc:336
void plugin_shutdown(void)
Definition: sql_plugin.cc:2008
bool plugin_foreach_with_mask(THD *thd, plugin_foreach_func *func, int type, uint state_mask, void *arg)
Definition: sql_plugin.cc:2749
int unlock_plugin_data()
Unlocks the plugin strucutres as locked by lock_plugin_data()
Definition: sql_plugin.cc:3718
case opt name
Definition: sslopt-case.h:32
The MEM_ROOT is a simple arena, where allocations are carved out of larger blocks.
Definition: my_alloc.h:78
Definition: mysql_lex_string.h:39
Definition: mysql_lex_string.h:34
Definition: plugin.h:65
Definition: my_getopt.h:90
An instrumented mutex structure.
Definition: mysql_mutex_bits.h:49
Definition: plugin.h:668
Definition: sql_plugin.h:84
LEX_STRING dl
Definition: sql_plugin.h:85
void * handle
Definition: sql_plugin.h:86
int version
Definition: sql_plugin.h:88
struct st_mysql_plugin * plugins
Definition: sql_plugin.h:87
uint ref_count
Definition: sql_plugin.h:89
Definition: sql_plugin_ref.h:44
unsigned int uint
Definition: uca-dump.cc:29