diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..de4a392 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +/vendor +/composer.lock diff --git a/bin/dbmodel-files b/bin/dbmodel-files new file mode 100644 index 0000000..fd9d3a4 --- /dev/null +++ b/bin/dbmodel-files @@ -0,0 +1,224 @@ +#!/usr/bin/env php + $source_dir) { + echo "➡️ [$index]: $project_root/$source_dir\n"; +} +$selected = readline("❔ Select source dir [default: 0]: "); +$selected = empty($selected) ? 0 : $selected; +if (!isset($source_dirs[$selected])) { + echo "⛔ Invalid selection\n"; + exit(2); +} +$source_dir = $project_root . '/' . $source_dirs[$selected]; +$source_dir = rtrim($source_dir, '/') . '/'; +$namespaces = array_keys($composer_arr['autoload']['psr-4']); +$namespace = $namespaces[$selected]; +echo "✔️ Source dir: {$source_dir} with namespace: {$namespace}\n"; + +// Copy files +echo "ℹ️ Copy files\n"; + +copyFile($project_root . '/config/Configuration.php', '<' . '?php + +$others_config = scandir(__DIR__); +$loaded = false; +foreach ($others_config as $file) { + if ($file == basename(__FILE__)) continue; + if (substr($file, -4) == \'.php\') { + require_once __DIR__ . \'/\' . $file; + $loaded = true; + } +} + +if (!$loaded) { + class Configuration + { + public const DB_TYPE = \'sqlite\'; + // MySQL + public const DB_HOST = \'localhost\'; + public const DB_USER = \'username\'; + public const DB_PASS = \'****************\'; + public const DB_NAME = \'databasename\'; + // SQLite + public const DB_FILEPATH = __DIR__ . \'/../../data/database.db\'; + } +} + +$protocol = (!empty($_SERVER[\'HTTPS\']) && $_SERVER[\'HTTPS\'] !== \'off\') ? "https://" : "http://"; +$host = $_SERVER[\'HTTP_HOST\']; +$uri = $_SERVER[\'REQUEST_URI\']; // obsahuje aj query string + +define(\'URL_PREFIX\', $protocol.$host.str_replace(basename($_SERVER[\'SCRIPT_NAME\']), \'\', $_SERVER[\'SCRIPT_NAME\'])); +'); + +copyFile($source_dir . 'Maintenance.php', '<' . '?php + +namespace ' . $namespace . '; + +class Maintenance extends \TPsoft\DBmodel\Maintenance +{ + + public function database() + { + if (!$this->existsTable(\'options\')) { + $this->checkDBTable(\'options\', \' + `key` VARCHAR(255) NOT NULL PRIMARY KEY, + `value` VARCHAR(255) NOT NULL + \'); + $this->dbver(1); + } + $dbver = $this->dbver(); + if ($dbver == 1) { + // create new + } + } + + protected function settings(string $key, ?string $value = null): string|false + { + if (is_null($value)) { + return $this->dbh->getOne(sprintf(\'SELECT `value` FROM `options` WHERE `key` = %s\', $this->dbh->quote($key))); + } else { + $db_type = $this->dbh->getDBtype(); + switch ($db_type) { + case \'mysql\': + return $this->dbh->query(sprintf( + \'INSERT INTO `options` (`key`, `value`) VALUES (%s, %s) ON DUPLICATE KEY UPDATE `value` = %s\', + $this->dbh->quote($key), + $this->dbh->quote($value), + $this->dbh->quote($value) + )) !== false; + break; + case \'sqlite\': + return $this->dbh->query(sprintf( + \'INSERT INTO `options` (`key`, `value`) VALUES (%s, %s) ON CONFLICT(`key`) DO UPDATE SET `value` = %s\', + $this->dbh->quote($key), + $this->dbh->quote($value), + $this->dbh->quote($value) + )) !== false; + break; + default: + new \Exception(\'Unknown DB type: \' . $db_type); + return false; + break; + } + } + } + + protected function dbver(?string $ver = null) + { + return $this->settings(\'version\', $ver); + } +} +'); + +copyFile($source_dir . 'Init.php', '<' . '?php + +require __DIR__ . \'/../vendor/autoload.php\'; + +use \Exception; +use \TPsoft\DBmodel\DBmodel; +use \\' . $namespace . 'Maintenance; + +global $dbh; + +if (Configuration::DB_TYPE == \'mysql\') { + $dbh = new DBmodel(sprintf(\'mysql:host=%s;dbname=%s;charset=utf8mb4\', Configuration::DB_HOST, Configuration::DB_NAME), Configuration::DB_USER, Configuration::DB_PASS); +} else if (Configuration::DB_TYPE == \'sqlite\') { + $dbh = new DBmodel(sprintf(\'sqlite:%s\', Configuration::DB_FILEPATH)); +} else { + throw new Exception(\'Unknown database type\'); +} + +$maintenance = new Maintenance($dbh); +$maintenance->database(); +'); + +copyFile($project_root . '/scripts/createModel.php', '<' . '?php + +require_once __DIR__ . \'/../src/Init.php\'; +use \TPsoft\DBmodel\Creator; + +global $dbh; +$creator = new Creator($dbh); +$creator->rootDir(realpath(__DIR__.\'/../src/\')); +$creator->interact(); +'); + +// Change composer.json +if (!isset($composer_arr['autoload']['files'])) { + $composer_arr['autoload']['files'] = []; +} +$composer_arr['autoload']['files'][] = 'config/Configuration.php'; +if (!isset($composer_arr['scripts'])) { + $composer_arr['scripts'] = []; +} +if (!isset($composer_arr['scripts']['model'])) { + $composer_arr['scripts']['model'] = 'php scripts/createModel.php'; +} + +$composer_json = json_encode($composer_arr, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES); +$composer_json = preg_replace_callback( + '/^( +)/m', + fn($m) => str_repeat("\t", intdiv(strlen($m[1]), 4)), + $composer_json +); +$suc = file_put_contents($project_root . '/composer.json', $composer_json); +if ($suc) { + echo "✅ File changed: $project_root/composer.json\n"; +} else { + echo "🔴 Failed to change file: $project_root/composer.json\n"; +} + + +/** + * Functions + */ +function findProjectRoot(string $startDir): ?string +{ + $dir = realpath($startDir); + + while ($dir && $dir !== dirname($dir)) { + if (file_exists($dir . '/composer.json')) { + return $dir; + } + $dir = dirname($dir); + } + return null; +} + +function copyFile(string $destination, string $content): bool +{ + $dir = dirname($destination); + if (!file_exists($dir)) { + mkdir($dir, 0777, true); + } + if (file_exists($destination)) { + echo "⚠️ File already exists: $destination\n"; + $confirm = readline("❔ Overwrite? (y - yes, other - no): "); + if ($confirm != 'y') { + return false; + } + } + $suc = file_put_contents($destination, $content) !== false; + if ($suc) { + echo "✅ File created: $destination\n"; + } else { + echo "🔴 Failed to create file: $destination\n"; + } + return $suc; +} diff --git a/composer.json b/composer.json index a0a8359..ac91537 100644 --- a/composer.json +++ b/composer.json @@ -27,6 +27,9 @@ "psr-4": { "TPsoft\\DBmodel\\": "src/" } - } + }, + "bin": [ + "bin/dbmodel-files" + ] }