3declare(strict_types=1);
12if (!defined(
'dbxSystem')) {
13 define(
'dbxSystem',
'dbxWebApp');
15if (!defined(
'dbxRunAsAdmin')) {
16 define(
'dbxRunAsAdmin', 1);
19require_once
$root .
'/dbx/vendor/autoload.php';
20require_once
$root .
'/dbx/include/dbxKernel.php';
21require_once dirname(__DIR__) .
'/include/dbxDatabaseMigrationService.class.php';
30 private int $nextId = 1;
43 'dbx|dbxUser' =>
'dbx_user',
44 'dbx|dbxUser_groups' =>
'dbx_user_groups',
51 return array_replace(array(
52 'source' =>
'local-binding',
54 'resolved_server' =>
$dd ===
'dbx|dbxUser'
57 'declared_server' =>
'dbxUser.db3',
61 public function select1(
string $dd, array $where, mixed $columns,
int $access): array
63 foreach ($this->
rows[
$dd] ?? array() as $row) {
65 foreach ($where as $name =>
$value) {
66 if (($row[$name] ??
null) !==
$value) {
85 $values[
'id'] = $this->nextId++;
87 $this->writes[] = array(
'mode' =>
'insert',
'dd' =>
$dd,
'values' => $values);
88 return (
int)$values[
'id'];
103 foreach ($this->
rows[
$dd] as &$row) {
104 if ((
int)($row[
'id'] ?? 0) === $id) {
105 $row = array_replace($row, $values);
110 $this->writes[] = array(
'mode' =>
'update',
'dd' =>
$dd,
'values' => $values);
143 $this->ledgerCreated =
true;
149 if (
$mode !==
'reset') {
151 $this->syncDefinitions[
$module .
'|' .
$dd] = array_values(array_map(
152 static fn(array
$field):
string => (
string)(
$field[
'name'] ??
''),
157 'status' =>
$mode ===
'reset' ?
'reset' :
'finished',
182 throw new RuntimeException($message);
189$backup = sys_get_temp_dir() .
'/dbx-migration-test-' . bin2hex(random_bytes(4));
194 isset($discovered[
'core-4.0.3-user-identity']),
195 'Core-Migration wurde nicht entdeckt.'
200 $state[
'pending'] === array(
'core-4.0.3-user-identity'),
201 'Ausstehende Migration wurde nicht geplant.'
205 (
$servers[
'dbx|dbxUser'] ??
'') ===
'mysqlUsers'
206 && (
$servers[
'dbx|dbxUser_groups'] ??
'') ===
'dbxUser.db3',
207 'Gemischte DD-Serverbindungen wurden im Migrationsplan nicht erhalten.'
212 'source' =>
'dd-default',
213 'resolved_server' =>
'dbx|dbxUser.db3',
214 'declared_server' =>
'dbx|dbxUser.db3',
227 'Qualifizierter und relativer SQLite-Server wurden nicht als identisch erkannt.'
230 dbxDatabaseMigrationService::class,
231 'canonicalServerReference'
235 ===
'dbx|dbxUser.db3',
236 'Modulrelativer SQLite-Server wurde nicht kanonisch qualifiziert.'
241 'source' =>
'dd-default',
242 'resolved_server' =>
'legacyUsers',
243 'declared_server' =>
'legacyUsers',
252 }
catch (RuntimeException $exception) {
254 $exception->getMessage(),
260 'Ein echter DD-Serverwechsel wurde nicht blockiert.'
264 && array_key_exists(
'dbxUser',
$_SESSION[
'dbx'][
'cache'][
'dd'][
'dbx']);
266 ?
$_SESSION[
'dbx'][
'cache'][
'dd'][
'dbx'][
'dbxUser']
268 $_SESSION[
'dbx'][
'cache'][
'dd'][
'dbx'][
'dbxUser'] = array(
269 'table' => array(
'server' =>
'legacyUsers',
'table' =>
'legacy_user'),
270 'fields' => array(array(
'name' =>
'legacy_only')),
271 'indexes' => array(),
276 $applied[
'applied'] === array(
'core-4.0.3-user-identity'),
277 'Migration wurde nicht ausgefuehrt.'
280 in_array(
'uname',
$dd->syncDefinitions[
'dbx|dbxUser'] ?? array(),
true)
281 && !in_array(
'legacy_only',
$dd->syncDefinitions[
'dbx|dbxUser'] ?? array(),
true),
282 'sync_dd hat nicht die DD-Definition aus dem Releasebaum verwendet.'
288 $_SESSION[
'dbx'][
'cache'][
'dd'][
'dbx'][
'dbxUser'][
'fields'] ?? array(),
293 'Der vorherige DD-Cache wurde nach der Migration nicht wiederhergestellt.'
298 unset(
$_SESSION[
'dbx'][
'cache'][
'dd'][
'dbx'][
'dbxUser']);
301 dbxDatabaseMigrationService::LEDGER_DD,
302 array(
'migration_id' =>
'core-4.0.3-user-identity'),
307 (
$ledger[
'status'] ??
'') ===
'finished',
308 'Migration wurde nicht als abgeschlossen protokolliert.'
313 array_column(
$groups,
'name') === array(
'guest',
'member',
'admin'),
314 'Core-Seeds wurden durch die Migration nicht angelegt.'
319 in_array(
'mysqlUsers|dbx_user',
$dd->dropped,
true)
320 && in_array(
'dbxUser.db3|dbx_user_groups',
$dd->dropped,
true),
321 'Rollback behandelt die gemischten Server nicht einzeln.'
324 echo
"OK migration discovery, checksum ledger, mixed bindings and rollback\n";
327 $iterator =
new RecursiveIteratorIterator(
328 new RecursiveDirectoryIterator(
$backup, FilesystemIterator::SKIP_DOTS),
329 RecursiveIteratorIterator::CHILD_FIRST
332 $item->isDir() ? rmdir($item->getPathname()) : unlink($item->getPathname());
insert(string $dd, array $values, int $access, int $fields, int $valueCheck, int $trace)
get_dd_server(string $dd)
update(string $dd, array $values, int $id, int $access, int $fields, int $valueCheck, int $trace)
get_dd_server_binding_info(string $dd)
select1(string $dd, array $where, mixed $columns, int $access)
drop_db_tab(string $server, string $table)
get_table_exist(string $server, string $table)
get_db_fields(string $server, string $table)
create_db_tab(string $dd)
sync_dd_to_db(string $module, string $dd, string $mode)
get_db_indexes(string $server, string $table)
Engine-unabhaengiger, DD-basierter Datenbank-Migrationsrunner.
$_SERVER['REQUEST_METHOD']
$equivalentDb bindingOverride
migration_assert(bool $condition, string $message)
$_SESSION['dbx']['cache']['dd']['dbx']['dbxUser']
if(!defined( 'dbxSystem')) if(!defined( 'dbxRunAsAdmin'))
$existingDb rows['dbx|dbxUser'][]