Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -80,6 +80,7 @@ include/probes_mysql.d
include/probes_mysql_dtrace.h
include/probes_mysql_nodtrace.h
include/source_revision.h
include/service_versions.h
info_macros.cmake
libmysql*/libmysql*_exports_file.cc
libmysql*/merge_archives_mysql*.cmake
Expand Down
1 change: 1 addition & 0 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -493,6 +493,7 @@ SET(PYTHON_SHEBANG "/usr/bin/env python3" CACHE STRING "python shebang")
MARK_AS_ADVANCED(PYTHON_SHEBANG)

# Add storage engines and plugins.
INCLUDE(cmake/mariadb_services.cmake)
CONFIGURE_PLUGINS()

ADD_SUBDIRECTORY(include)
Expand Down
241 changes: 241 additions & 0 deletions cmake/mariadb_services.cmake
Original file line number Diff line number Diff line change
@@ -0,0 +1,241 @@
# MariaDB service ABI definitions and generated ABI files.
#
# This file is included from the top-level CMakeLists.txt:
#
# include(cmake/mariadb_services.cmake)
#
# It is the single source of truth for the service ABI versions.
#
# Each service is:
#
# <name> <version> <ELF symbol>
#
# Version format:
#
# 0xMMmm
#
# which becomes:
#
# MARIADB_<name>_MM.mm
#
# For example:
#
# my_sha1 0x0101 my_sha1_service
#
# becomes:
#
# VERSION_my_sha1 = 0x0101
# MARIADB_SYMVER_my_sha1_service = "MARIADB_my_sha1_1.1"
#
# and the linker script exports:
#
# MARIADB_my_sha1_1.1 {
# global:
# my_sha1_service;
# };


# ---------------------------------------------------------------------------
# Service definitions
# ---------------------------------------------------------------------------

set(MARIADB_SERVICES
# name version ELF symbol

debug_sync 0x1000 debug_sync_service
kill_statement 0x1000 thd_kill_statement_service

base64 0x0100 base64_service
encryption 0x0300 encryption_service
encryption_scheme 0x0100 encryption_scheme_service
logger 0x0100 logger_service
thd_log_warnings 0x0100 thd_log_warnings_service
my_crypt 0x0100 my_crypt_service
my_md5 0x0100 my_md5_service
my_print_error 0x0100 my_print_error_service
my_sha1 0x0101 my_sha1_service
my_sha2 0x0100 my_sha2_service
my_snprintf 0x0100 my_snprintf_service
progress_report 0x0100 progress_report_service

thd_alloc 0x0200 thd_alloc_service
thd_autoinc 0x0100 thd_autoinc_service
thd_error_context 0x0200 thd_error_context_service
thd_rnd 0x0100 thd_rnd_service
thd_specifics 0x0100 thd_specifics_service
thd_timezone 0x0100 thd_timezone_service
thd_wait 0x0100 thd_wait_service

wsrep 0x0500 wsrep_service
json 0x0100 json_service
sql_service 0x0102 sql_service_handler
thd_mdl 0x0100 thd_mdl_service
print_check_msg 0x0100 print_check_msg_service

provider_bzip2 0x0100 provider_service_bzip2
provider_lz4 0x0100 provider_service_lz4
provider_lzma 0x0100 provider_service_lzma
provider_lzo 0x0100 provider_service_lzo
provider_snappy 0x0100 provider_service_snappy
)


# ---------------------------------------------------------------------------
# Generated files
# ---------------------------------------------------------------------------

set(MARIADB_GENERATED_DIR
"${CMAKE_CURRENT_BINARY_DIR}/generated"
)

set(MARIADB_VERSION_HEADER
"${CMAKE_CURRENT_BINARY_DIR}/include/service_versions.h"
)

set(MARIADB_VERSION_SCRIPT
"${CMAKE_CURRENT_BINARY_DIR}/sql/mariadb_services.lds"
)

# ---------------------------------------------------------------------------
# Generate service_versions.h and the linker version script
# ---------------------------------------------------------------------------

set(_MARIADB_HEADER [=[
/* Generated file -- DO NOT EDIT. */
#pragma once

#ifdef _WIN32
#define SERVICE_VERSION __declspec(dllexport) void *
#else
#define SERVICE_VERSION void *
#endif


#if defined(__ELF__) && defined(__GNUC__)

#define MARIADB_SERVICE_VERSION(name, symbol, version) \
MARIADB_SERVICE_VERSION_IMPL(name, symbol, version)

#define MARIADB_SERVICE_VERSION_IMPL(name, symbol, version) \
_Static_assert( \
(version) == VERSION_##name, \
"MariaDB service ABI version mismatch: " #name); \
__asm__(".symver " #symbol "," #symbol "@" \
MARIADB_SYMVER_##symbol)

#else

#define MARIADB_SERVICE_VERSION(name, symbol, version) \
_Static_assert( \
(version) == VERSION_##name, \
"MariaDB service ABI version mismatch: " #name)

#endif
]=])

set(_MARIADB_LDS [=[
/* Generated file -- DO NOT EDIT. */
]=])

list(LENGTH MARIADB_SERVICES _service_count)

math(EXPR _service_last
"${_service_count} - 1"
)

if(_service_count GREATER 0)
foreach(_i RANGE 0 ${_service_last} 3)

math(EXPR _version_index "${_i} + 1")
math(EXPR _symbol_index "${_i} + 2")

list(GET MARIADB_SERVICES ${_i} _name)
list(GET MARIADB_SERVICES ${_version_index} _version)
list(GET MARIADB_SERVICES ${_symbol_index} _symbol)

# Validate the version.
if(NOT _version MATCHES "^0x[0-9A-Fa-f]+$")
message(FATAL_ERROR
"Invalid version '${_version}' for MariaDB service '${_name}'"
)
endif()

# Convert 0xMMmm into major/minor.
math(EXPR _major "${_version} >> 8")
math(EXPR _minor "${_version} & 0xff")

set(_elf_version
"MARIADB_${_name}_${_major}.${_minor}"
)

# -------------------------------------------------------------------
# service_versions.h
# -------------------------------------------------------------------

string(APPEND _MARIADB_HEADER
"#define VERSION_${_name} ${_version}\n"
)

string(APPEND _MARIADB_HEADER
"#define MARIADB_SYMVER_${_symbol} \"${_elf_version}\"\n"
)

string(APPEND _MARIADB_HEADER
"\n"
)

# -------------------------------------------------------------------
# linker script
# -------------------------------------------------------------------

string(APPEND _MARIADB_LDS
"${_elf_version} {\n"
" global:\n"
" ${_symbol};\n"
"};\n"
"\n"
)

endforeach()
endif()


# ---------------------------------------------------------------------------
# Write generated files
# ---------------------------------------------------------------------------

file(GENERATE
OUTPUT "${MARIADB_VERSION_HEADER}"
CONTENT "${_MARIADB_HEADER}"
)

file(GENERATE
OUTPUT "${MARIADB_VERSION_SCRIPT}"
CONTENT "${_MARIADB_LDS}"
)


# ---------------------------------------------------------------------------
# Convenience target
# ---------------------------------------------------------------------------

add_custom_target(mariadb_service_versions
DEPENDS
"${MARIADB_VERSION_HEADER}"
"${MARIADB_VERSION_SCRIPT}"
)


# ---------------------------------------------------------------------------
# Include generated headers from the build tree.
#
# This makes:
#
# #include "service_versions.h"
#
# work for targets that use the normal MariaDB include paths.
# ---------------------------------------------------------------------------

include_directories(
"${MARIADB_GENERATED_DIR}"
)
3 changes: 3 additions & 0 deletions include/mysql/service_base64.h
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@
extern "C" {
#endif

#include "service_versions.h"
#ifndef MYSQL_ABI_CHECK
#include <stdlib.h>
#endif
Expand All @@ -44,6 +45,8 @@ extern struct base64_service_st {

#ifdef MYSQL_DYNAMIC_PLUGIN

MARIADB_SERVICE_VERSION(base64, base64_service, 0x0100);

#define my_base64_needed_encoded_length(A) base64_service->base64_needed_encoded_length_ptr(A)
#define my_base64_encode_max_arg_length() base64_service->base64_encode_max_arg_length_ptr()
#define my_base64_needed_decoded_length(A) base64_service->base64_needed_decoded_length_ptr(A)
Expand Down
2 changes: 2 additions & 0 deletions include/mysql/service_debug_sync.h
Original file line number Diff line number Diff line change
Expand Up @@ -318,6 +318,7 @@
See also http://forge.mysql.com/worklog/task.php?id=4259
*/

#include "service_versions.h"
#ifndef MYSQL_ABI_CHECK
#include <stdlib.h>
#endif
Expand All @@ -328,6 +329,7 @@ extern "C" {

#ifdef MYSQL_DYNAMIC_PLUGIN
extern void (*debug_sync_service)(MYSQL_THD, const char *, size_t);
MARIADB_SERVICE_VERSION(debug_sync, debug_sync_service, 0x1000);
#else
#define debug_sync_service debug_sync_C_callback_ptr
extern void (*debug_sync_C_callback_ptr)(MYSQL_THD, const char *, size_t);
Expand Down
3 changes: 3 additions & 0 deletions include/mysql/service_encryption.h
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@
*provider* (encryption plugin).
*/

#include "service_versions.h"
#ifndef MYSQL_ABI_CHECK
#include <my_alloca.h>
#ifdef _WIN32
Expand All @@ -36,6 +37,7 @@
#ifdef __cplusplus
extern "C" {
#endif
#include "service_versions.h"
#ifndef MYSQL_ABI_CHECK
#include <assert.h>
#endif
Expand Down Expand Up @@ -72,6 +74,7 @@ struct encryption_service_st {
#ifdef MYSQL_DYNAMIC_PLUGIN

extern struct encryption_service_st *encryption_service;
MARIADB_SERVICE_VERSION(encryption, encryption_service, 0x0300);

#define encryption_key_get_latest_version(KI) encryption_service->encryption_key_get_latest_version_func(KI)
#define encryption_key_get(KI,KV,K,S) encryption_service->encryption_key_get_func((KI),(KV),(K),(S))
Expand Down
2 changes: 2 additions & 0 deletions include/mysql/service_encryption_scheme.h
Original file line number Diff line number Diff line change
Expand Up @@ -106,6 +106,8 @@ extern struct encryption_scheme_service_st {

#ifdef MYSQL_DYNAMIC_PLUGIN

MARIADB_SERVICE_VERSION(encryption_scheme, encryption_scheme_service, 0x0100);

#define encryption_scheme_encrypt(S,SL,D,DL,SCH,KV,I32,J32,I64) encryption_scheme_service->encryption_scheme_encrypt_func(S,SL,D,DL,SCH,KV,I32,J32,I64)
#define encryption_scheme_decrypt(S,SL,D,DL,SCH,KV,I32,J32,I64) encryption_scheme_service->encryption_scheme_decrypt_func(S,SL,D,DL,SCH,KV,I32,J32,I64)

Expand Down
2 changes: 2 additions & 0 deletions include/mysql/service_json.h
Original file line number Diff line number Diff line change
Expand Up @@ -82,6 +82,8 @@ extern struct json_service_st {

#ifdef MYSQL_DYNAMIC_PLUGIN

MARIADB_SERVICE_VERSION(json, json_service, 0x0100);

#define json_type json_service->json_type
#define json_get_array_item json_service->json_get_array_item
#define json_get_object_key json_service->json_get_object_key
Expand Down
2 changes: 2 additions & 0 deletions include/mysql/service_kill_statement.h
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,8 @@ extern struct kill_statement_service_st {

#ifdef MYSQL_DYNAMIC_PLUGIN

MARIADB_SERVICE_VERSION(kill_statement, thd_kill_statement_service, 0x1000);

#define thd_kill_level(THD) \
thd_kill_statement_service->thd_kill_level_func(THD)

Expand Down
3 changes: 3 additions & 0 deletions include/mysql/service_log_warnings.h
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,9 @@ extern struct thd_log_warnings_service_st {
} *thd_log_warnings_service;

#ifdef MYSQL_DYNAMIC_PLUGIN

MARIADB_SERVICE_VERSION(thd_log_warnings, thd_log_warnings_service, 0x0100);

# define thd_log_warnings(THD) thd_log_warnings_service->thd_log_warnings(THD)
#else
/**
Expand Down
3 changes: 3 additions & 0 deletions include/mysql/service_logger.h
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
#ifndef MYSQL_SERVICE_LOGGER_INCLUDED
#define MYSQL_SERVICE_LOGGER_INCLUDED

#include "service_versions.h"
#ifndef MYSQL_ABI_CHECK
#include <stdarg.h>
#endif
Expand Down Expand Up @@ -73,6 +74,8 @@ extern struct logger_service_st {

#ifdef MYSQL_DYNAMIC_PLUGIN

MARIADB_SERVICE_VERSION(logger, logger_service, 0x0100);

#define logger_init_mutexes logger_service->logger_init_mutexes
#define logger_open(path, size_limit, rotations) \
(logger_service->open(path, size_limit, rotations))
Expand Down
3 changes: 3 additions & 0 deletions include/mysql/service_md5.h
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@
extern "C" {
#endif

#include "service_versions.h"
#ifndef MYSQL_ABI_CHECK
#include <stdlib.h>
#endif
Expand All @@ -42,6 +43,8 @@ extern struct my_md5_service_st {

#ifdef MYSQL_DYNAMIC_PLUGIN

MARIADB_SERVICE_VERSION(my_md5, my_md5_service, 0x0100);

#define my_md5(A,B,C) my_md5_service->my_md5_type(A,B,C)
#define my_md5_multi my_md5_service->my_md5_multi_type
#define my_md5_context_size() my_md5_service->my_md5_context_size_type()
Expand Down
2 changes: 2 additions & 0 deletions include/mysql/service_my_crypt.h
Original file line number Diff line number Diff line change
Expand Up @@ -74,6 +74,8 @@ extern struct my_crypt_service_st {

#ifdef MYSQL_DYNAMIC_PLUGIN

MARIADB_SERVICE_VERSION(my_crypt, my_crypt_service, 0x0100);

#define my_aes_crypt_init(A,B,C,D,E,F,G) \
my_crypt_service->my_aes_crypt_init(A,B,C,D,E,F,G)

Expand Down
Loading
Loading