55 lines
1.8 KiB
PHP
55 lines
1.8 KiB
PHP
<?php
|
|
|
|
declare(strict_types=1);
|
|
|
|
namespace andrewkydev\Database;
|
|
|
|
use andrewkydev\Database\Config\DatabaseConfigLoader;
|
|
use andrewkydev\Database\Connection\ConnectionManager;
|
|
use andrewkydev\Database\Migration\MigrationManager;
|
|
use andrewkydev\Database\ORM\EntityManager;
|
|
use andrewkydev\Database\Query\QueryRunner;
|
|
use andrewkydev\Database\Schema\SchemaManager;
|
|
use pocketmine\plugin\PluginBase;
|
|
|
|
final class Loader extends PluginBase {
|
|
private ?DatabaseApi $api = null;
|
|
|
|
public function onEnable(): void {
|
|
$this->saveDefaultConfig();
|
|
|
|
$config = DatabaseConfigLoader::load($this->getConfig());
|
|
$this->assertExtensions($config->driver);
|
|
|
|
$connections = new ConnectionManager($config);
|
|
$schema = new SchemaManager($connections, $config);
|
|
$query = new QueryRunner($connections, $config);
|
|
$orm = new EntityManager($connections, $config);
|
|
$orm->cache()->attachPlugin($this, $orm);
|
|
|
|
$migrations = new MigrationManager($schema, $query, $config);
|
|
$this->api = new DatabaseApi($schema, $query, $orm, $connections, $config, $migrations);
|
|
DatabaseProvider::set($this->api);
|
|
}
|
|
|
|
public function onDisable(): void {
|
|
if ($this->api !== null) {
|
|
$this->api->close();
|
|
}
|
|
DatabaseProvider::set(null);
|
|
$this->api = null;
|
|
}
|
|
|
|
private function assertExtensions(string $driver): void {
|
|
if (!extension_loaded('pdo')) {
|
|
throw new \RuntimeException('PDO extension is required');
|
|
}
|
|
if ($driver === 'mysql' && !extension_loaded('pdo_mysql')) {
|
|
throw new \RuntimeException('pdo_mysql extension is required for MySQL');
|
|
}
|
|
if ($driver === 'postgres' && !extension_loaded('pdo_pgsql')) {
|
|
throw new \RuntimeException('pdo_pgsql extension is required for PostgreSQL');
|
|
}
|
|
}
|
|
}
|