<?php
/**
* Manager Tru
*
* @package RMCS
* @author Vlad Shashkov <vlad.s@zimalab.com>
* @copyright 2014 - 2019 The Zimalab
*/
declare(strict_types=1);
namespace App\Service;
use App\Entity\Main\Tru;
use Doctrine\Persistence\{ManagerRegistry, ObjectManager};
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
use Symfony\Component\HttpKernel\KernelInterface;
class ManagerTru
{
/**
* @var ObjectManager
*/
private $emTru;
/**
* @var ObjectManager
*/
private $emGlobal;
/**
* @var string
*/
private $projectDir;
/**
* @var string
*/
private const NAME = 'corros10_';
/**
* @var string
*/
private const DUMP_DB = 'tru_db.sql';
/**
* @var string
*/
private const SETTING_TABLE = 'sys_settings';
/**
* ManagerTru constructor
*
* @param ManagerRegistry $managerRegistry
* @param KernelInterface $kernel
*/
public function __construct(ManagerRegistry $managerRegistry, KernelInterface $kernel)
{
$this->emGlobal = $managerRegistry->getManager('default');
$this->emTru = $managerRegistry->getManager('tru');
$this->projectDir = $kernel->getProjectDir() . '/data/';
}
/**
* Delete Tru
*
* @param int $id
*/
public function delete(int $id): void
{
$tru = $this->findTru($id);
$this->exitsTru($tru);
$connection = $this->emTru->getConnection();
$connection->prepare("DROP DATABASE {$tru->getDataSource()};")->execute();
$this->emGlobal->remove($tru);
$this->emGlobal->flush();
}
/**
* Create tru
*
* @param Tru $tru
*/
public function create(Tru $tru): void
{
$name = $this->generateNameDatabase($tru->getId());
$tru->setDataSource($name);
$connection = $this->emTru->getConnection();
$connection->prepare("CREATE DATABASE {$name};USE {$name}")->execute();
$sqlStructDb = file_get_contents($this->projectDir . self::DUMP_DB);
$connection->prepare($sqlStructDb)->execute();
$this->createSettingTru();
$this->seedDataSetting();
$connection->close();
}
/**
* Select tru
*
* @param string $name
*/
public function select(string $name): void
{
$this->emTru->getConnection()->prepare("USE {$name};")->execute();
}
/**
* Check valid tru
*
* @param Tru|null $tru
*/
public function validTru(?Tru $tru): void
{
if (!$tru || $tru->isInit()) {
throw new NotFoundHttpException('Not found tru or already init');
}
}
/**
* Check exits tru
*
* @param Tru|null $tru
*/
public function exitsTru(?Tru $tru): void
{
if (!$tru) {
throw new NotFoundHttpException('Not found tru');
}
}
/**
* Find tru by id
*
* @param int $id
* @return Tru|null
*/
public function findTru(int $id): ?Tru
{
return $this->emGlobal->getRepository(Tru::class)
->find($id);
}
/**
* Get entityManager tru
*
* @return ObjectManager
*/
public function getEmTru(): ObjectManager
{
return $this->emTru;
}
/**
* Get entityManager global
*
* @return ObjectManager
*/
public function getEmGlobal(): ObjectManager
{
return $this->emGlobal;
}
/**
* @param string|null $id
* @return string
*/
private function generateNameDatabase(?string $id): string
{
return self::NAME . str_pad(strval($id), 4, '0', STR_PAD_LEFT);
}
/**
* @return string
*/
private function getQueryCreateSetting(): string
{
$globalConnection = $this->emGlobal->getConnection();
$sqlQuery = $globalConnection
->prepare('SHOW CREATE TABLE' . ' ' . self::SETTING_TABLE);
$sqlQuery->execute();
return $sqlQuery->fetch()['Create Table'] . ';';
}
/**
* Create table sys_settings in tru
*/
private function createSettingTru(): void
{
$truConnection = $this->emTru->getConnection();
$setting = $truConnection->prepare($this->getQueryCreateSetting());
$setting->execute();
}
/**
* Seed data in table sys_settings
*/
private function seedDataSetting(): void
{
$truConnection = $this->emTru->getConnection();
$globalConnection = $this->emGlobal->getConnection();
$settingData = $globalConnection->prepare('SELECT * FROM' . ' ' . self::SETTING_TABLE);
$settingData->execute();
$settingData = $settingData->fetchAll();
foreach ($settingData as $el) {
$truConnection->insert(self::SETTING_TABLE, $el);
}
}
}