58 lines
2.2 KiB
PHP
58 lines
2.2 KiB
PHP
<?php
|
|
function env_first_db(array $keys, string $default = ''): string {
|
|
foreach ($keys as $key) {
|
|
$value = getenv($key);
|
|
if ($value !== false && $value !== '') return $value;
|
|
}
|
|
return $default;
|
|
}
|
|
|
|
define('DB_HOST', env_first_db(['DB_HOST', 'MYSQL_HOST', 'MARIADB_HOST'], 'database'));
|
|
define('DB_NAME', env_first_db(['WEBGIS_V3_DB_NAME', 'DB_NAME'], 'webgis_kemiskinan'));
|
|
define('DB_USER', env_first_db(['DB_USER', 'MYSQL_USER', 'MARIADB_USER'], 'root'));
|
|
define('DB_PASS', env_first_db(['DB_PASSWORD', 'MYSQL_PASSWORD', 'MARIADB_PASSWORD'], ''));
|
|
define('DB_CHAR', getenv('DB_CHAR') ?: 'utf8mb4');
|
|
|
|
function getDB(): PDO {
|
|
static $pdo = null;
|
|
if ($pdo === null) {
|
|
$serverDsn = "mysql:host=".DB_HOST.";charset=".DB_CHAR;
|
|
$server = new PDO($serverDsn, DB_USER, DB_PASS, [
|
|
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
|
|
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
|
|
PDO::ATTR_EMULATE_PREPARES => false,
|
|
]);
|
|
|
|
$safeDb = preg_replace('/[^a-zA-Z0-9_]/', '', DB_NAME);
|
|
$server->exec("CREATE DATABASE IF NOT EXISTS `$safeDb` CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci");
|
|
|
|
$dsn = "mysql:host=".DB_HOST.";dbname=".$safeDb.";charset=".DB_CHAR;
|
|
$pdo = new PDO($dsn, DB_USER, DB_PASS, [
|
|
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
|
|
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
|
|
PDO::ATTR_EMULATE_PREPARES => false,
|
|
]);
|
|
|
|
ensureWebgisV3Schema($pdo);
|
|
}
|
|
return $pdo;
|
|
}
|
|
|
|
function ensureWebgisV3Schema(PDO $pdo): void {
|
|
$stmt = $pdo->query("SHOW TABLES LIKE 'role'");
|
|
if ($stmt->fetch()) return;
|
|
|
|
$schemaFile = __DIR__ . '/../sql/schema.sql';
|
|
if (!is_file($schemaFile)) return;
|
|
|
|
$sql = file_get_contents($schemaFile);
|
|
$sql = preg_replace('/CREATE DATABASE IF NOT EXISTS\s+`?webgis_kemiskinan`?.*?;/is', '', $sql);
|
|
$sql = preg_replace('/USE\s+`?webgis_kemiskinan`?\s*;/i', '', $sql);
|
|
$sql = preg_replace('/^\s*--.*$/m', '', $sql);
|
|
|
|
foreach (array_filter(array_map('trim', explode(';', $sql))) as $statement) {
|
|
if ($statement === '') continue;
|
|
$pdo->exec($statement);
|
|
}
|
|
}
|