2
0
mirror of https://github.com/boostorg/mysql.git synced 2026-01-22 05:22:22 +00:00
Files
mysql/tools/ci/ci_util/db_setup.py
Anarthal (Rubén Pérez) c242bb0ffd Added CI tests for MySQL 9.x
close #303
2025-10-07 16:56:17 +02:00

118 lines
3.8 KiB
Python

#!/usr/bin/python3
#
# Copyright (c) 2019-2025 Ruben Perez Hidalgo (rubenperez038 at gmail dot com)
#
# Distributed under the Boost Software License, Version 1.0. (See accompanying
# file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
#
from typing import List, Dict
from pathlib import Path
import subprocess
import os
from .common import IS_WINDOWS
from enum import Enum
import re
class _DbSystemType(Enum):
mysql5 = 1
mysql8 = 2
mysql9 = 3
mariadb = 4
def _run_piped_stdin(args: List[str], fname: Path) -> None:
with open(str(fname), 'rt', encoding='utf8') as f:
content = f.read()
print('+ ', args, '(with < {})'.format(fname), flush=True)
subprocess.run(args, input=content.encode(), check=True)
def _run_piped_stdout(args: List[str]) -> str:
print('+ ', args, flush=True)
return subprocess.check_output(args).decode()
def _run_sql_file(fname: Path) -> None:
_run_piped_stdin(['mysql', '-u', 'root'], fname)
def _get_server_version() -> str:
return _run_piped_stdout([
'mysql', '-u', 'root', '--column-names=0', '--batch', '-e', 'SELECT VERSION()'
])
def _parse_db_version(db: str) -> _DbSystemType:
# Parse the version string
match = re.match(r'([0-9]*)\.[0-9]*\.[0-9]*(\-MariaDB)?.*', db, re.IGNORECASE)
if match is None:
raise ValueError('Bad DB version: {}'.format(db))
vmaj = int(match.group(1))
is_mariadb = match.group(2) is not None
# Perform the matching
if is_mariadb:
return _DbSystemType.mariadb
elif vmaj == 8:
return _DbSystemType.mysql8
elif vmaj >= 9:
return _DbSystemType.mysql9
else:
return _DbSystemType.mysql5
def _compute_disabled_features(db: _DbSystemType) -> Dict[str, bool]:
return {
# UNIX sockets. Only Windows CI servers don't have them enabled
'unix-sockets': IS_WINDOWS,
# sha256. Disabled on mysql5 and mariadb
'sha256': db in (_DbSystemType.mysql5, _DbSystemType.mariadb),
# JSON type. Disabled in mariadb
'json-type': db == _DbSystemType.mariadb,
# regex-error-codes. Disabled in mysql5 and mariadb
'regex-error-codes': db in (_DbSystemType.mysql5, _DbSystemType.mariadb),
# dup-query-error-codes. Disabled in mysql systems
'dup-query-error-codes': db in (_DbSystemType.mysql5, _DbSystemType.mysql8, _DbSystemType.mysql9),
# mysql_native_password. Disabled in mysql9
'mnp': db == _DbSystemType.mysql9,
}
def db_setup(
source_dir: Path,
server_host: str,
) -> None:
# Get the server version
db = _get_server_version()
print('+ Server version: {}'.format(db), flush=True)
# Get the disabled server features
disabled_features = _compute_disabled_features(_parse_db_version(db))
disabled_features_str = ' '.join(feature for feature, disabled in disabled_features.items() if disabled)
print('+ Disabled server features: {}'.format(disabled_features_str))
# Source files
_run_sql_file(source_dir.joinpath('example', 'db_setup.sql'))
_run_sql_file(source_dir.joinpath('example', '3_advanced', 'http_server_cpp20', 'db_setup.sql'))
_run_sql_file(source_dir.joinpath('test', 'integration', 'db_setup.sql'))
if not disabled_features['sha256']:
_run_sql_file(source_dir.joinpath('test', 'integration', 'db_setup_sha256.sql'))
if not disabled_features['mnp']:
_run_sql_file(source_dir.joinpath('test', 'integration', 'db_setup_mnp.sql'))
# Setup environment variables
os.environ['BOOST_MYSQL_SERVER_HOST'] = server_host
os.environ['BOOST_MYSQL_DISABLED_SERVER_FEATURES'] = disabled_features_str
# Loads benchmark data. This takes around 15s, so we don't do it unless necessary
def db_setup_bench(source_dir: Path) -> None:
_run_sql_file(source_dir.joinpath('bench', 'db_setup.sql'))