migration to mysql
Some checks failed
PHPUnit / test (push) Has been cancelled

This commit is contained in:
2026-07-10 09:57:44 +02:00
parent 351af170a0
commit 810ed24792
24 changed files with 986 additions and 208 deletions

View File

@ -76,6 +76,9 @@ function qdb_parse_env_file(string $path): array {
* Read an environment variable (.env file first, then getenv / $_ENV / $_SERVER).
*/
function qdb_env_get(string $name): ?string {
if (isset($GLOBALS['qdb_env_overrides'][$name])) {
return (string)$GLOBALS['qdb_env_overrides'][$name];
}
$fileVars = qdb_parse_env_file(qdb_env_file_path());
if (isset($fileVars[$name]) && $fileVars[$name] !== '') {
return $fileVars[$name];
@ -110,6 +113,15 @@ function qdb_env_set(string $name, string $value): void {
}
}
/** Override a configuration value for the current process, ahead of .env. */
function qdb_env_override(string $name, string $value): void {
$GLOBALS['qdb_env_overrides'][$name] = $value;
qdb_env_set($name, $value);
if ($name === 'QDB_DRIVER' && function_exists('qdb_reset_driver_cache')) {
qdb_reset_driver_cache();
}
}
/** Load KEY=value pairs from .env into $GLOBALS['qdb_dotenv'] and $_ENV. */
function qdb_load_dotenv(string $path): void {
foreach (qdb_parse_env_file($path) as $name => $value) {
@ -382,19 +394,18 @@ define('QDB_SOURCE_LANGUAGE', 'de');
function qdb_ensure_source_language(PDO $pdo): void {
if (qdb_column_exists($pdo, 'language', 'enabled')) {
$pdo->prepare("INSERT INTO language (languageCode, name, enabled) VALUES (:lc, :n, 1)
ON CONFLICT(languageCode) DO UPDATE SET enabled = 1")
$pdo->prepare('INSERT INTO language (languageCode, name, enabled) VALUES (:lc, :n, 1) '
. qdb_upsert_update(['languageCode'], ['enabled' => '1', 'name' => 'excluded.name']))
->execute([':lc' => QDB_SOURCE_LANGUAGE, ':n' => 'German']);
return;
}
$pdo->prepare("INSERT INTO language (languageCode, name) VALUES (:lc, :n)
ON CONFLICT(languageCode) DO NOTHING")
$pdo->prepare('INSERT INTO language (languageCode, name) VALUES (:lc, :n) '
. qdb_upsert_do_nothing(['languageCode']))
->execute([':lc' => QDB_SOURCE_LANGUAGE, ':n' => 'German']);
}
/** @return list<array{languageCode:string,name:string,enabled:int}> */
function qdb_load_languages(PDO $pdo): array {
qdb_ensure_source_language($pdo);
$hasEnabled = qdb_column_exists($pdo, 'language', 'enabled');
if ($hasEnabled) {
$rows = $pdo->query(
@ -439,9 +450,9 @@ function qdb_set_language_enabled(PDO $pdo, string $languageCode, bool $enabled)
if (!qdb_column_exists($pdo, 'language', 'enabled')) {
throw new RuntimeException('Language enablement is not available on this database');
}
$pdo->prepare('UPDATE language SET enabled = :en WHERE languageCode = :lc')
->execute([':en' => $enabled ? 1 : 0, ':lc' => $languageCode]);
if ($pdo->query('SELECT changes()')->fetchColumn() == 0) {
$stmt = $pdo->prepare('UPDATE language SET enabled = :en WHERE languageCode = :lc');
$stmt->execute([':en' => $enabled ? 1 : 0, ':lc' => $languageCode]);
if (qdb_stmt_affected_rows($pdo, $stmt) === 0) {
throw new InvalidArgumentException('Language not found');
}
}
@ -496,7 +507,7 @@ function qdb_set_questionnaire_language_disabled(
if ($disabled) {
$pdo->prepare(
'INSERT INTO questionnaire_language_disable (questionnaireID, languageCode)
VALUES (:qid, :lc) ON CONFLICT(questionnaireID, languageCode) DO NOTHING'
VALUES (:qid, :lc) ' . qdb_upsert_do_nothing(['questionnaireID', 'languageCode'])
)->execute([':qid' => $questionnaireID, ':lc' => $languageCode]);
return;
}
@ -1161,24 +1172,24 @@ function qdb_app_ui_string_entries_for_website(PDO $pdo): array {
/** Upsert one translation row; sync German text into defaultText for questions/options. */
function qdb_put_translation(PDO $pdo, string $type, string $id, string $lang, string $text): void {
if ($type === 'question') {
$pdo->prepare("INSERT INTO question_translation (questionID, languageCode, text)
VALUES (:id, :lang, :t)
ON CONFLICT(questionID, languageCode) DO UPDATE SET text = excluded.text")
$pdo->prepare('INSERT INTO question_translation (questionID, languageCode, text)
VALUES (:id, :lang, :t) '
. qdb_upsert_update(['questionID', 'languageCode'], ['text' => 'excluded.text']))
->execute([':id' => $id, ':lang' => $lang, ':t' => $text]);
if ($lang === QDB_SOURCE_LANGUAGE) {
$pdo->prepare("UPDATE question SET defaultText = :t WHERE questionID = :id")
->execute([':t' => $text, ':id' => $id]);
}
} elseif ($type === 'answer_option') {
$pdo->prepare("INSERT INTO answer_option_translation (answerOptionID, languageCode, text)
VALUES (:id, :lang, :t)
ON CONFLICT(answerOptionID, languageCode) DO UPDATE SET text = excluded.text")
$pdo->prepare('INSERT INTO answer_option_translation (answerOptionID, languageCode, text)
VALUES (:id, :lang, :t) '
. qdb_upsert_update(['answerOptionID', 'languageCode'], ['text' => 'excluded.text']))
->execute([':id' => $id, ':lang' => $lang, ':t' => $text]);
// defaultText holds optionKey; German label lives only in answer_option_translation.
} elseif ($type === 'string' || $type === 'app_string') {
$pdo->prepare("INSERT INTO string_translation (stringKey, languageCode, text)
VALUES (:id, :lang, :t)
ON CONFLICT(stringKey, languageCode) DO UPDATE SET text = excluded.text")
$pdo->prepare('INSERT INTO string_translation (stringKey, languageCode, text)
VALUES (:id, :lang, :t) '
. qdb_upsert_update(['stringKey', 'languageCode'], ['text' => 'excluded.text']))
->execute([':id' => $id, ':lang' => $lang, ':t' => $text]);
}
}
@ -2500,8 +2511,8 @@ function qdb_import_translations_bundle(PDO $pdo, array $bundle): array {
if ($lc === '' || $lc === QDB_SOURCE_LANGUAGE) {
continue;
}
$pdo->prepare('INSERT INTO language (languageCode, name) VALUES (:lc, :n)
ON CONFLICT(languageCode) DO UPDATE SET name = excluded.name')
$pdo->prepare('INSERT INTO language (languageCode, name) VALUES (:lc, :n) '
. qdb_upsert_update(['languageCode'], ['name' => 'excluded.name']))
->execute([':lc' => $lc, ':n' => $name]);
}