1 /* Copyright (c) 2016, 2020, Oracle and/or its affiliates. All rights reserved.
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 #include <mysql/components/component_implementation.h>
24 #include <mysql/components/minimal_chassis.h>
25 #include <mysql/components/my_service.h>
26 #include <mysql/components/services/dynamic_loader_scheme_file.h>
27 #include <mysql/components/services/mysql_cond_service.h>
28 #include <mysql/components/services/mysql_mutex_service.h>
29 #include <mysql/components/services/mysql_psi_system_service.h>
30 #include <mysql/components/services/mysql_runtime_error_service.h>
31 #include <mysql/components/services/mysql_rwlock_service.h>
32 
33 // pfs services
34 #include "storage/perfschema/pfs.h"
35 #include "storage/perfschema/pfs_plugin_table.h"
36 
37 #include <stddef.h>
38 #include <new>
39 #include <stdexcept>  // std::exception subclasses
40 
41 #include "audit_api_connection_service_imp.h"
42 #include "audit_api_message_service_imp.h"
43 #include "component_status_var_service_imp.h"
44 #include "component_sys_var_service_imp.h"
45 #include "dynamic_loader_path_filter_imp.h"
46 #include "host_application_signal_imp.h"
47 #include "keyring_iterator_service_imp.h"
48 #include "log_builtins_filter_imp.h"
49 #include "log_builtins_imp.h"
50 #include "my_inttypes.h"
51 #include "mysql_backup_lock_imp.h"
52 #include "mysql_clone_protocol_imp.h"
53 #include "mysql_connection_attributes_iterator_imp.h"
54 #include "mysql_current_thread_reader_imp.h"
55 #include "mysql_ongoing_transaction_query_imp.h"
56 #include "mysql_page_track_imp.h"
57 #include "mysql_runtime_error_imp.h"
58 #include "mysql_server_runnable_imp.h"
59 #include "mysql_string_service_imp.h"
60 #include "mysqld_error.h"
61 #include "persistent_dynamic_loader_imp.h"
62 #include "security_context_imp.h"
63 #include "sql/auth/dynamic_privileges_impl.h"
64 #include "sql/log.h"
65 #include "sql/mysqld.h"  // srv_registry
66 #include "sql/server_component/mysql_admin_session_imp.h"
67 #include "sql/udf_registration_imp.h"
68 #include "storage/perfschema/pfs_services.h"
69 #include "system_variable_source_imp.h"
70 #include "udf_metadata_imp.h"
71 
72 // Must come after sql/log.h.
73 #include "mysql/components/services/log_builtins.h"
74 
75 /* Implementation located in the mysql_server component. */
76 extern SERVICE_TYPE(mysql_cond_v1)
77     SERVICE_IMPLEMENTATION(mysql_server, mysql_cond_v1);
78 extern SERVICE_TYPE(mysql_mutex_v1)
79     SERVICE_IMPLEMENTATION(mysql_server, mysql_mutex_v1);
80 extern SERVICE_TYPE(mysql_rwlock_v1)
81     SERVICE_IMPLEMENTATION(mysql_server, mysql_rwlock_v1);
82 extern SERVICE_TYPE(mysql_psi_system_v1)
83     SERVICE_IMPLEMENTATION(mysql_server, mysql_psi_system_v1);
84 
85 extern REQUIRES_SERVICE_PLACEHOLDER(mysql_rwlock_v1);
86 extern REQUIRES_SERVICE_PLACEHOLDER(mysql_psi_system_v1);
87 
88 BEGIN_SERVICE_IMPLEMENTATION(mysql_server_path_filter,
89                              dynamic_loader_scheme_file)
90 mysql_dynamic_loader_scheme_file_path_filter_imp::load,
91     mysql_dynamic_loader_scheme_file_path_filter_imp::unload
92     END_SERVICE_IMPLEMENTATION();
93 
94 BEGIN_SERVICE_IMPLEMENTATION(mysql_server, persistent_dynamic_loader)
95 mysql_persistent_dynamic_loader_imp::load,
96     mysql_persistent_dynamic_loader_imp::unload END_SERVICE_IMPLEMENTATION();
97 
98 BEGIN_SERVICE_IMPLEMENTATION(mysql_server, dynamic_privilege_register)
99 dynamic_privilege_services_impl::register_privilege,
100     dynamic_privilege_services_impl::unregister_privilege
101     END_SERVICE_IMPLEMENTATION();
102 
103 BEGIN_SERVICE_IMPLEMENTATION(mysql_server, global_grants_check)
104 dynamic_privilege_services_impl::has_global_grant END_SERVICE_IMPLEMENTATION();
105 
106 BEGIN_SERVICE_IMPLEMENTATION(mysql_server, mysql_string_factory)
107 mysql_string_imp::create,
108     mysql_string_imp::destroy END_SERVICE_IMPLEMENTATION();
109 
110 BEGIN_SERVICE_IMPLEMENTATION(mysql_server, mysql_string_case)
111 mysql_string_imp::tolower,
112     mysql_string_imp::toupper END_SERVICE_IMPLEMENTATION();
113 
114 BEGIN_SERVICE_IMPLEMENTATION(mysql_server, mysql_string_converter)
115 mysql_string_imp::convert_from_buffer,
116     mysql_string_imp::convert_to_buffer END_SERVICE_IMPLEMENTATION();
117 
118 BEGIN_SERVICE_IMPLEMENTATION(mysql_server, mysql_string_character_access)
119 mysql_string_imp::get_char,
120     mysql_string_imp::get_char_length END_SERVICE_IMPLEMENTATION();
121 
122 BEGIN_SERVICE_IMPLEMENTATION(mysql_server, mysql_string_byte_access)
123 mysql_string_imp::get_byte,
124     mysql_string_imp::get_byte_length END_SERVICE_IMPLEMENTATION();
125 
126 BEGIN_SERVICE_IMPLEMENTATION(mysql_server, mysql_string_iterator)
127 mysql_string_imp::iterator_create, mysql_string_imp::iterator_get_next,
128     mysql_string_imp::iterator_destroy END_SERVICE_IMPLEMENTATION();
129 
130 BEGIN_SERVICE_IMPLEMENTATION(mysql_server, mysql_string_ctype)
131 mysql_string_imp::is_upper, mysql_string_imp::is_lower,
132     mysql_string_imp::is_digit END_SERVICE_IMPLEMENTATION();
133 
134 BEGIN_SERVICE_IMPLEMENTATION(mysql_server, log_builtins)
135 log_builtins_imp::wellknown_by_type, log_builtins_imp::wellknown_by_name,
136     log_builtins_imp::wellknown_get_type, log_builtins_imp::wellknown_get_name,
137 
138     log_builtins_imp::item_inconsistent, log_builtins_imp::item_generic_type,
139     log_builtins_imp::item_string_class, log_builtins_imp::item_numeric_class,
140 
141     log_builtins_imp::item_set_int, log_builtins_imp::item_set_float,
142     log_builtins_imp::item_set_lexstring, log_builtins_imp::item_set_cstring,
143 
144     log_builtins_imp::item_set_with_key, log_builtins_imp::item_set,
145 
146     log_builtins_imp::line_item_set_with_key, log_builtins_imp::line_item_set,
147 
148     log_builtins_imp::line_init, log_builtins_imp::line_exit,
149     log_builtins_imp::line_item_count,
150 
151     log_builtins_imp::line_item_types_seen,
152 
153     log_builtins_imp::line_item_iter_acquire,
154     log_builtins_imp::line_item_iter_release,
155     log_builtins_imp::line_item_iter_first,
156     log_builtins_imp::line_item_iter_next,
157     log_builtins_imp::line_item_iter_current,
158 
159     log_builtins_imp::line_submit,
160 
161     log_builtins_imp::message,
162 
163     log_builtins_imp::sanitize,
164 
165     log_builtins_imp::errmsg_by_errcode, log_builtins_imp::errcode_by_errsymbol,
166 
167     log_builtins_imp::label_from_prio,
168 
169     log_builtins_imp::open_errstream, log_builtins_imp::write_errstream,
170     log_builtins_imp::dedicated_errstream,
171     log_builtins_imp::close_errstream END_SERVICE_IMPLEMENTATION();
172 
173 BEGIN_SERVICE_IMPLEMENTATION(mysql_server, log_builtins_filter)
174 log_builtins_filter_imp::filter_ruleset_new,
175     log_builtins_filter_imp::filter_ruleset_lock,
176     log_builtins_filter_imp::filter_ruleset_unlock,
177     log_builtins_filter_imp::filter_ruleset_drop,
178     log_builtins_filter_imp::filter_ruleset_free,
179     log_builtins_filter_imp::filter_ruleset_move,
180     log_builtins_filter_imp::filter_rule_init,
181     log_builtins_filter_imp::filter_run END_SERVICE_IMPLEMENTATION();
182 
183 BEGIN_SERVICE_IMPLEMENTATION(mysql_server, log_builtins_filter_debug)
184 log_builtins_filter_debug_imp::filter_debug_ruleset_get
185 END_SERVICE_IMPLEMENTATION();
186 
187 BEGIN_SERVICE_IMPLEMENTATION(mysql_server, log_builtins_string)
188 log_builtins_string_imp::malloc, log_builtins_string_imp::strndup,
189     log_builtins_string_imp::free,
190 
191     log_builtins_string_imp::length, log_builtins_string_imp::find_first,
192     log_builtins_string_imp::find_last,
193 
194     log_builtins_string_imp::compare,
195 
196     log_builtins_string_imp::substitutev,
197     log_builtins_string_imp::substitute END_SERVICE_IMPLEMENTATION();
198 
199 BEGIN_SERVICE_IMPLEMENTATION(mysql_server, log_builtins_tmp)
200 log_builtins_tmp_imp::notify_client END_SERVICE_IMPLEMENTATION();
201 
202 BEGIN_SERVICE_IMPLEMENTATION(mysql_server, log_builtins_syseventlog)
203 log_builtins_syseventlog_imp::open, log_builtins_syseventlog_imp::write,
204     log_builtins_syseventlog_imp::close END_SERVICE_IMPLEMENTATION();
205 
206 BEGIN_SERVICE_IMPLEMENTATION(mysql_server, udf_registration)
207 mysql_udf_registration_imp::udf_register,
208     mysql_udf_registration_imp::udf_unregister END_SERVICE_IMPLEMENTATION();
209 
210 BEGIN_SERVICE_IMPLEMENTATION(mysql_server, udf_registration_aggregate)
211 mysql_udf_registration_imp::udf_register_aggregate,
212     mysql_udf_registration_imp::udf_unregister END_SERVICE_IMPLEMENTATION();
213 
214 BEGIN_SERVICE_IMPLEMENTATION(mysql_server, mysql_udf_metadata)
215 mysql_udf_metadata_imp::argument_get, mysql_udf_metadata_imp::result_get,
216     mysql_udf_metadata_imp::argument_set,
217     mysql_udf_metadata_imp::result_set END_SERVICE_IMPLEMENTATION();
218 
219 BEGIN_SERVICE_IMPLEMENTATION(mysql_server, component_sys_variable_register)
220 mysql_component_sys_variable_imp::register_variable,
221     mysql_component_sys_variable_imp::get_variable END_SERVICE_IMPLEMENTATION();
222 
223 BEGIN_SERVICE_IMPLEMENTATION(mysql_server, mysql_connection_attributes_iterator)
224 mysql_connection_attributes_iterator_imp::init,
225     mysql_connection_attributes_iterator_imp::deinit,
226     mysql_connection_attributes_iterator_imp::get END_SERVICE_IMPLEMENTATION();
227 
228 BEGIN_SERVICE_IMPLEMENTATION(mysql_server, component_sys_variable_unregister)
229 mysql_component_sys_variable_imp::unregister_variable,
230     END_SERVICE_IMPLEMENTATION();
231 
232 BEGIN_SERVICE_IMPLEMENTATION(mysql_server, status_variable_registration)
233 mysql_status_variable_registration_imp::register_variable,
234     mysql_status_variable_registration_imp::unregister_variable
235     END_SERVICE_IMPLEMENTATION();
236 
237 BEGIN_SERVICE_IMPLEMENTATION(mysql_server, system_variable_source)
238 mysql_system_variable_source_imp::get END_SERVICE_IMPLEMENTATION();
239 
240 BEGIN_SERVICE_IMPLEMENTATION(mysql_server, mysql_backup_lock)
241 mysql_acquire_backup_lock,
242     mysql_release_backup_lock END_SERVICE_IMPLEMENTATION();
243 
244 BEGIN_SERVICE_IMPLEMENTATION(mysql_server, clone_protocol)
245 mysql_clone_start_statement, mysql_clone_finish_statement,
246     mysql_clone_get_charsets, mysql_clone_validate_charsets,
247     mysql_clone_get_configs, mysql_clone_validate_configs, mysql_clone_connect,
248     mysql_clone_send_command, mysql_clone_get_response, mysql_clone_kill,
249     mysql_clone_disconnect, mysql_clone_get_error, mysql_clone_get_command,
250     mysql_clone_send_response,
251     mysql_clone_send_error END_SERVICE_IMPLEMENTATION();
252 
253 BEGIN_SERVICE_IMPLEMENTATION(mysql_server, mysql_thd_security_context)
254 mysql_security_context_imp::get,
255     mysql_security_context_imp::set END_SERVICE_IMPLEMENTATION();
256 
257 BEGIN_SERVICE_IMPLEMENTATION(mysql_server, mysql_security_context_factory)
258 mysql_security_context_imp::create, mysql_security_context_imp::destroy,
259     mysql_security_context_imp::copy END_SERVICE_IMPLEMENTATION();
260 
261 BEGIN_SERVICE_IMPLEMENTATION(mysql_server,
262                              mysql_account_database_security_context_lookup)
263 mysql_security_context_imp::lookup END_SERVICE_IMPLEMENTATION();
264 
265 BEGIN_SERVICE_IMPLEMENTATION(mysql_server, mysql_security_context_options)
266 mysql_security_context_imp::get,
267     mysql_security_context_imp::set END_SERVICE_IMPLEMENTATION();
268 
269 BEGIN_SERVICE_IMPLEMENTATION(mysql_server, mysql_ongoing_transactions_query)
270 mysql_ongoing_transactions_query_imp::get_ongoing_server_transactions
271 END_SERVICE_IMPLEMENTATION();
272 
273 BEGIN_SERVICE_IMPLEMENTATION(mysql_server, host_application_signal)
274 mysql_component_host_application_signal_imp::signal
275 END_SERVICE_IMPLEMENTATION();
276 
277 BEGIN_SERVICE_IMPLEMENTATION(mysql_server, mysql_audit_api_message)
278 mysql_audit_api_message_imp::emit END_SERVICE_IMPLEMENTATION();
279 
280 BEGIN_SERVICE_IMPLEMENTATION(mysql_server, mysql_page_track)
281 Page_track_implementation::start, Page_track_implementation::stop,
282     Page_track_implementation::purge, Page_track_implementation::get_page_ids,
283     Page_track_implementation::get_num_page_ids,
284     Page_track_implementation::get_status END_SERVICE_IMPLEMENTATION();
285 
286 BEGIN_SERVICE_IMPLEMENTATION(mysql_server, mysql_runtime_error)
287 mysql_server_runtime_error_imp::emit END_SERVICE_IMPLEMENTATION();
288 
289 BEGIN_SERVICE_IMPLEMENTATION(mysql_server, mysql_current_thread_reader)
290 mysql_component_mysql_current_thread_reader_imp::get
291 END_SERVICE_IMPLEMENTATION();
292 
293 BEGIN_SERVICE_IMPLEMENTATION(mysql_server, mysql_keyring_iterator)
294 mysql_keyring_iterator_imp::init, mysql_keyring_iterator_imp::deinit,
295     mysql_keyring_iterator_imp::get END_SERVICE_IMPLEMENTATION();
296 
297 BEGIN_SERVICE_IMPLEMENTATION(mysql_server, mysql_admin_session)
298 mysql_component_mysql_admin_session_imp::open END_SERVICE_IMPLEMENTATION();
299 
300 BEGIN_SERVICE_IMPLEMENTATION(mysql_server, mysql_server_runnable)
301 mysql_server_runnable_imp::run END_SERVICE_IMPLEMENTATION();
302 
303 BEGIN_SERVICE_IMPLEMENTATION(mysql_server, mysql_audit_api_connection)
304 mysql_audit_api_connection_imp::emit END_SERVICE_IMPLEMENTATION();
305 
306 BEGIN_SERVICE_IMPLEMENTATION(mysql_server,
307                              mysql_audit_api_connection_with_error)
308 mysql_audit_api_connection_with_error_imp::emit END_SERVICE_IMPLEMENTATION();
309 
310 BEGIN_COMPONENT_PROVIDES(mysql_server)
311 PROVIDES_SERVICE(mysql_server_path_filter, dynamic_loader_scheme_file),
312     PROVIDES_SERVICE(mysql_server, persistent_dynamic_loader),
313     PROVIDES_SERVICE(mysql_server, dynamic_privilege_register),
314     PROVIDES_SERVICE(mysql_server, global_grants_check),
315     PROVIDES_SERVICE(mysql_server, mysql_string_factory),
316     PROVIDES_SERVICE(mysql_server, mysql_string_case),
317     PROVIDES_SERVICE(mysql_server, mysql_string_converter),
318     PROVIDES_SERVICE(mysql_server, mysql_string_character_access),
319     PROVIDES_SERVICE(mysql_server, mysql_string_byte_access),
320     PROVIDES_SERVICE(mysql_server, mysql_string_iterator),
321     PROVIDES_SERVICE(mysql_server, mysql_string_ctype),
322     PROVIDES_SERVICE(mysql_server, log_builtins),
323     PROVIDES_SERVICE(mysql_server, log_builtins_filter),
324     PROVIDES_SERVICE(mysql_server, log_builtins_filter_debug),
325     PROVIDES_SERVICE(mysql_server, log_builtins_string),
326     PROVIDES_SERVICE(mysql_server, log_builtins_tmp),
327     PROVIDES_SERVICE(mysql_server, log_builtins_syseventlog),
328     PROVIDES_SERVICE(mysql_server, udf_registration),
329     PROVIDES_SERVICE(mysql_server, udf_registration_aggregate),
330     PROVIDES_SERVICE(mysql_server, mysql_udf_metadata),
331     PROVIDES_SERVICE(mysql_server, component_sys_variable_register),
332     PROVIDES_SERVICE(mysql_server, component_sys_variable_unregister),
333     PROVIDES_SERVICE(mysql_server, mysql_cond_v1),
334     PROVIDES_SERVICE(mysql_server, mysql_mutex_v1),
335     PROVIDES_SERVICE(mysql_server, mysql_rwlock_v1),
336     PROVIDES_SERVICE(mysql_server, status_variable_registration),
337     PROVIDES_SERVICE(mysql_server, system_variable_source),
338     PROVIDES_SERVICE(mysql_server, mysql_backup_lock),
339     PROVIDES_SERVICE(mysql_server, clone_protocol),
340     PROVIDES_SERVICE(mysql_server, mysql_thd_security_context),
341     PROVIDES_SERVICE(mysql_server, mysql_security_context_factory),
342     PROVIDES_SERVICE(mysql_server,
343                      mysql_account_database_security_context_lookup),
344     PROVIDES_SERVICE(mysql_server, mysql_security_context_options),
345     PROVIDES_SERVICE(mysql_server, mysql_ongoing_transactions_query),
346     PROVIDES_SERVICE(mysql_server, host_application_signal),
347     PROVIDES_SERVICE(mysql_server, mysql_audit_api_message),
348     PROVIDES_SERVICE(mysql_server, mysql_page_track),
349     PROVIDES_SERVICE(mysql_server, mysql_runtime_error),
350     PROVIDES_SERVICE(mysql_server, mysql_current_thread_reader),
351     PROVIDES_SERVICE(mysql_server, mysql_keyring_iterator),
352     PROVIDES_SERVICE(mysql_server, mysql_admin_session),
353     PROVIDES_SERVICE(mysql_server, mysql_connection_attributes_iterator),
354     PROVIDES_SERVICE(mysql_server, mysql_server_runnable),
355     PROVIDES_SERVICE(mysql_server, mysql_audit_api_connection),
356     PROVIDES_SERVICE(mysql_server, mysql_audit_api_connection_with_error),
357     PROVIDES_SERVICE(mysql_server, mysql_psi_system_v1),
358     PROVIDES_SERVICE(performance_schema, psi_cond_v1),
359     PROVIDES_SERVICE(performance_schema, psi_error_v1),
360     PROVIDES_SERVICE(performance_schema, psi_file_v2),
361     PROVIDES_SERVICE(performance_schema, psi_idle_v1),
362     PROVIDES_SERVICE(performance_schema, psi_mdl_v1),
363     PROVIDES_SERVICE(performance_schema, psi_memory_v1),
364     PROVIDES_SERVICE(performance_schema, psi_mutex_v1),
365     /* Obsolete: PROVIDES_SERVICE(performance_schema, psi_rwlock_v1), */
366     PROVIDES_SERVICE(performance_schema, psi_rwlock_v2),
367     PROVIDES_SERVICE(performance_schema, psi_socket_v1),
368     PROVIDES_SERVICE(performance_schema, psi_stage_v1),
369     /* Deprecated, use psi_statement_v2. */
370     PROVIDES_SERVICE(performance_schema, psi_statement_v1),
371     PROVIDES_SERVICE(performance_schema, psi_statement_v2),
372     PROVIDES_SERVICE(performance_schema, psi_system_v1),
373     PROVIDES_SERVICE(performance_schema, psi_table_v1),
374     /* Obsolete: PROVIDES_SERVICE(performance_schema, psi_thread_v1), */
375     /* Obsolete: PROVIDES_SERVICE(performance_schema, psi_thread_v2), */
376     PROVIDES_SERVICE(performance_schema, psi_thread_v3),
377     PROVIDES_SERVICE(performance_schema, psi_transaction_v1),
378     /* Deprecated, use pfs_plugin_table_v1. */
379     PROVIDES_SERVICE(performance_schema, pfs_plugin_table),
380     PROVIDES_SERVICE(performance_schema, pfs_plugin_table_v1),
381     PROVIDES_SERVICE(performance_schema, pfs_plugin_column_tiny_v1),
382     PROVIDES_SERVICE(performance_schema, pfs_plugin_column_small_v1),
383     PROVIDES_SERVICE(performance_schema, pfs_plugin_column_medium_v1),
384     PROVIDES_SERVICE(performance_schema, pfs_plugin_column_integer_v1),
385     PROVIDES_SERVICE(performance_schema, pfs_plugin_column_bigint_v1),
386     PROVIDES_SERVICE(performance_schema, pfs_plugin_column_decimal_v1),
387     PROVIDES_SERVICE(performance_schema, pfs_plugin_column_float_v1),
388     PROVIDES_SERVICE(performance_schema, pfs_plugin_column_double_v1),
389     PROVIDES_SERVICE(performance_schema, pfs_plugin_column_string_v1),
390     PROVIDES_SERVICE(performance_schema, pfs_plugin_column_blob_v1),
391     PROVIDES_SERVICE(performance_schema, pfs_plugin_column_enum_v1),
392     PROVIDES_SERVICE(performance_schema, pfs_plugin_column_date_v1),
393     PROVIDES_SERVICE(performance_schema, pfs_plugin_column_time_v1),
394     PROVIDES_SERVICE(performance_schema, pfs_plugin_column_datetime_v1),
395     /* Deprecated, use pfs_plugin_column_timestamp_v2. */
396     PROVIDES_SERVICE(performance_schema, pfs_plugin_column_timestamp_v1),
397     PROVIDES_SERVICE(performance_schema, pfs_plugin_column_timestamp_v2),
398     PROVIDES_SERVICE(performance_schema, pfs_plugin_column_year_v1),
399     PROVIDES_SERVICE(performance_schema, psi_tls_channel_v1),
400     END_COMPONENT_PROVIDES();
401 
402 static BEGIN_COMPONENT_REQUIRES(mysql_server) END_COMPONENT_REQUIRES();
403 
404 #ifndef WITH_MYSQL_COMPONENTS_TEST_DRIVER
405 /*
406   These symbols are present in minimal chassis library. We defined again
407   for minimal chassis test driver, because we are not supposed to link
408   the minchassis to component_mysql_server
409   On windows we see these symbol issue, On other OSs we are seeing ODR
410   violation error(i.e ASAN error). Hence we added WIN define.
411 */
412 #ifdef _WIN32
413 REQUIRES_SERVICE_PLACEHOLDER(mysql_rwlock_v1);
414 REQUIRES_SERVICE_PLACEHOLDER(mysql_psi_system_v1);
415 REQUIRES_SERVICE_PLACEHOLDER(mysql_runtime_error);
mysql_components_handle_std_exception(const char *)416 void mysql_components_handle_std_exception(const char *) {}
417 #endif
418 #endif
419 
mysql_server_init()420 static mysql_service_status_t mysql_server_init() {
421 #ifndef WITH_MYSQL_COMPONENTS_TEST_DRIVER
422   /*
423     Changing minimal_chassis service implementations to mysql_server service
424     implementations
425   */
426   mysql_service_mysql_rwlock_v1 = &imp_mysql_server_mysql_rwlock_v1;
427   mysql_service_mysql_psi_system_v1 = &imp_mysql_server_mysql_psi_system_v1;
428   mysql_service_mysql_runtime_error = &imp_mysql_server_mysql_runtime_error;
429 #endif
430   return false;
431 }
432 
mysql_server_deinit()433 static mysql_service_status_t mysql_server_deinit() { return false; }
434 
435 /*
436   This wrapper function is created to have the conditional compilation for
437   mysqld server code(i.e sql_main) and the component_mysql_server used for
438   minimal chassis test driver.
439 */
initialize_minimal_chassis(SERVICE_TYPE_NO_CONST (registry)** registry)440 bool initialize_minimal_chassis(SERVICE_TYPE_NO_CONST(registry) * *registry) {
441 #ifndef WITH_MYSQL_COMPONENTS_TEST_DRIVER
442   /*
443     In case of minimal chassis test driver we just need to update the
444     registry with the mysql_service_registry reference. Because we already
445     initialized the minimal chassis in the test binary.
446   */
447   *registry =
448       const_cast<SERVICE_TYPE_NO_CONST(registry) *>(mysql_service_registry);
449 #else
450   /* Normal server code path. Hence we need to initialize minimal chassis */
451   if (minimal_chassis_init(registry, &COMPONENT_REF(mysql_server))) {
452     return true;
453   }
454 #endif
455   return false;
456 }
457 
deinitialize_minimal_chassis(SERVICE_TYPE_NO_CONST (registry)* registry MY_ATTRIBUTE ((unused)))458 bool deinitialize_minimal_chassis(SERVICE_TYPE_NO_CONST(registry) *
459                                   registry MY_ATTRIBUTE((unused))) {
460 #ifdef WITH_MYSQL_COMPONENTS_TEST_DRIVER
461   /* Normal server code path. Hence we need to deinitialize minimal chassis */
462   if (minimal_chassis_deinit(registry, &COMPONENT_REF(mysql_server))) {
463     return true;
464   }
465 #endif
466   return false;
467 }
468 
469 BEGIN_COMPONENT_METADATA(mysql_server)
470 METADATA("mysql.author", "Oracle Corporation"),
471     METADATA("mysql.license", "GPL"), END_COMPONENT_METADATA();
472 
473 DECLARE_COMPONENT(mysql_server, "mysql:core")
474 mysql_server_init, mysql_server_deinit END_DECLARE_COMPONENT();
475 
476 /* Below library header code is needed when component_mysql_server.so is
477    created. And it is not needed when the code is part of mysqld executable.
478    Hence WITH_MYSQL_COMPONENTS_TEST_DRIVER is used to handle the
479    conditional compilation. */
480 #ifndef WITH_MYSQL_COMPONENTS_TEST_DRIVER
481 /* components contained in this library.
482    for now assume that each library will have exactly one component. */
483 DECLARE_LIBRARY_COMPONENTS &COMPONENT_REF(mysql_server)
484     END_DECLARE_LIBRARY_COMPONENTS
485 #endif
486