mirror of
https://github.com/vitodeploy/vito.git
synced 2025-04-22 03:02:20 +00:00
64 lines
1.8 KiB
PHP
64 lines
1.8 KiB
PHP
<?php
|
|
|
|
namespace App\Actions\Database;
|
|
|
|
use App\Enums\DatabaseStatus;
|
|
use App\Models\Server;
|
|
use App\Models\Service;
|
|
use App\SSH\Services\Database\Database;
|
|
|
|
class SyncDatabases
|
|
{
|
|
public function sync(Server $server): void
|
|
{
|
|
$service = $server->database();
|
|
if (! $service instanceof \App\Models\Service) {
|
|
return;
|
|
}
|
|
/** @var Database $handler */
|
|
$handler = $service->handler();
|
|
|
|
$this->updateCharsets($service, $handler);
|
|
$this->updateDatabases($server, $handler);
|
|
}
|
|
|
|
private function updateCharsets(Service $service, Database $handler): void
|
|
{
|
|
$data = $service->type_data ?? [];
|
|
$charsets = $handler->getCharsets();
|
|
$data['charsets'] = $charsets['charsets'] ?? [];
|
|
$data['defaultCharset'] = $charsets['defaultCharset'] ?? '';
|
|
$service->type_data = $data;
|
|
$service->save();
|
|
}
|
|
|
|
private function updateDatabases(Server $server, Database $handler): void
|
|
{
|
|
$databases = $handler->getDatabases();
|
|
foreach ($databases as $database) {
|
|
/** @var ?\App\Models\Database $db */
|
|
$db = $server->databases()
|
|
->where('name', $database[0])
|
|
->first();
|
|
|
|
if ($db === null) {
|
|
$server->databases()->create([
|
|
'name' => $database[0],
|
|
'collation' => $database[2],
|
|
'charset' => $database[1],
|
|
'status' => DatabaseStatus::READY,
|
|
]);
|
|
|
|
continue;
|
|
}
|
|
|
|
if ($db->collation !== $database[2] || $db->charset !== $database[1]) {
|
|
$db->update([
|
|
'collation' => $database[2],
|
|
'charset' => $database[1],
|
|
]);
|
|
}
|
|
}
|
|
}
|
|
}
|