Files
DBmodel/bin/dbmodel-files
igor 7fdf4d32d5 fixed namespace,
removed use 'Exception' - has no effect
2026-02-09 07:16:18 +01:00

224 lines
6.0 KiB
PHP
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/usr/bin/env php
<?php
include $_composer_autoload_path ?? __DIR__ . '/../vendor/autoload.php';
echo " DBmodel files\n\n";
$project_root = findProjectRoot(__DIR__);
if (!$project_root) {
echo "⛔ Project root not found\n";
exit(1);
}
$composer_arr = json_decode(file_get_contents($project_root . '/composer.json'), true);
echo "Project root: {$project_root}\n";
$source_dirs = array_values($composer_arr['autoload']['psr-4']);
foreach ($source_dirs as $index => $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 ' . rtrim($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 \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);
if (!$dir) return null;
while ($dir && $dir !== dirname($dir)) {
if (is_file($dir . '/vendor/autoload.php')) {
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;
}