fixed database handler for DBmodel in Maintenance,

added test4 for Maintenance
This commit is contained in:
Igor Miňo 2025-05-29 22:55:10 +02:00
parent 0642d7a8ca
commit c2773db2dd
4 changed files with 183 additions and 62 deletions

65
models/Test.php Normal file
View File

@ -0,0 +1,65 @@
<?php
/*
TPsoft.org 2000-2025
file for controlers/*.php
Molestones:
2025-05-27 21:36 Created
*/
class Test extends \TPsoft\DBmodel\DBmodel {
public $tables = array(
'test' => array(
'name' => 'test',
'primary_key_name' => 'id',
'allow_attributes' => array(
'name' => 'varchar(255)',
'created' => 'datetime'
)
),
);
public function exist($primary_key = null) {
return $this->existRecord('test', $primary_key);
}
public function test($primary_key = null, $data = array()) {
return $this->record('test', $primary_key, $data);
}
public function testBy($colname, $colvalue) {
return $this->recordBy('test', $colname, $colvalue);
}
public function testSave($data = array()) {
return $this->test($this->exist($data) ? $data : null, $data);
}
public function testEmpty() {
return $this->recordEmpty('test');
}
public function testAttributes() {
return $this->typesAttributes('test');
}
public function testCount() {
return $this->count('test');
}
public function getList($search = array(), $reverse = false, $concat_or = false) {
return $this->search('test')
->where($search, $concat_or)
->order(array('id' => $reverse ? 'DESC' : 'ASC'))
->toArray();
}
public function testCombo($col_key, $col_value, $add_empty = false) {
return $this->search('test')
->toCombo($col_key, $col_value, $add_empty);
}
}
?>

View File

@ -27,7 +27,7 @@ class DBmodel
public $log = null; public $log = null;
public $tables = array(); public $tables = array();
public function __construct(string $dsn = null, ?string $username = null, #[\SensitiveParameter] ?string $password = null, ?array $options = null) public function __construct(?string $dsn = null, ?string $username = null, #[\SensitiveParameter] ?string $password = null, ?array $options = null)
{ {
if (is_null($dsn)) { if (is_null($dsn)) {
if (DBmodel::$instance) { if (DBmodel::$instance) {

View File

@ -26,17 +26,26 @@ class Maintenance
private DBmodel $dbh; private DBmodel $dbh;
public function __construct(DBmodel $dbh) public function __construct(?DBmodel $dbh)
{ {
$this->dbh = $dbh; if (is_null($dbh)) {
if (!is_null(DBmodel::$instance)) {
$this->dbh = DBmodel::$instance;
} else {
throw new \Exception('DB handler is null');
}
} else {
$this->dbh = $dbh;
}
} }
public function testDB($test, $test_out) public function testDB($test, $test_out)
{ {
global $core;
if (is_array($test_out)) { if (is_array($test_out)) {
$row = $core->dbh->getRow($test); $test_out = array_change_key_case($test_out, CASE_LOWER);
$row = $this->dbh->getRow($test);
if (!is_array($row)) return false; if (!is_array($row)) return false;
$row = array_change_key_case($row, CASE_LOWER);
foreach ($test_out as $col => $val) { foreach ($test_out as $col => $val) {
if (strlen($row[$col]) != strlen($val)) { if (strlen($row[$col]) != strlen($val)) {
$max_len = min(strlen($row[$col]), strlen($val)); $max_len = min(strlen($row[$col]), strlen($val));
@ -51,17 +60,16 @@ class Maintenance
} }
return true; return true;
} else { } else {
return $core->dbh->getOne($test) == $test_out; return $this->dbh->getOne($test) == $test_out;
} }
} }
public function checkDB($test, $test_out, $fix) public function checkDB($test, $test_out, $fix)
{ {
global $core;
if ($this->testDB($test, $test_out)) { if ($this->testDB($test, $test_out)) {
return Maintenance::OK; return Maintenance::OK;
} else { } else {
$core->dbh->query($fix); $this->dbh->query($fix);
if ($this->testDB($test, $test_out)) { if ($this->testDB($test, $test_out)) {
return Maintenance::FIXED; return Maintenance::FIXED;
} else { } else {
@ -71,12 +79,10 @@ class Maintenance
return 0; return 0;
} }
public function checkDBTable($table_index, $definition) public function checkDBTable($table_name, $definition)
{ {
global $core;
$table_name = $core->tables[$table_index];
if (strlen($table_name) <= 0) { if (strlen($table_name) <= 0) {
$this->lastMessage = 'Table ' . strtoupper($table_index) . ' - invalid index'; $this->lastMessage = 'Table ' . strtoupper($table_name) . ' - invalid index';
return Maintenance::ABNORMAL; return Maintenance::ABNORMAL;
} }
$status = $this->checkDB( $status = $this->checkDB(
@ -87,118 +93,127 @@ class Maintenance
// FIX query // FIX query
'CREATE TABLE `' . $table_name . '` (' . $definition . ')' 'CREATE TABLE `' . $table_name . '` (' . $definition . ')'
); );
$this->lastMessage = 'Table ' . strtoupper($table_index) . ' (' . $table_name . ')'; $this->lastMessage = 'Table ' . strtoupper($table_name) . ' (' . $table_name . ')';
return $status; return $status;
} }
public function checkDBAdd($table_index, $column, $definition) public function existsColumn($table_name, $column)
{
return $this->testDB(
'DESCRIBE `' . $table_name . '` `' . $column . '`',
$column
);
}
public function checkDBAdd($table_name, $column, $definition)
{ {
global $core;
$status = $this->checkDB( $status = $this->checkDB(
// TEST query // TEST query
'DESCRIBE `' . $core->tables[$table_index] . '` `' . $column . '`', 'DESCRIBE `' . $table_name . '` `' . $column . '`',
// TEST output // TEST output
$column, $column,
// FIX query // FIX query
'ALTER TABLE `' . $core->tables[$table_index] . '` ADD `' . $column . '` ' . $definition 'ALTER TABLE `' . $table_name . '` ADD `' . $column . '` ' . $definition
); );
$this->lastMessage = "Added column $column to table $table_index"; $this->lastMessage = "Added column $column to table $table_name";
return $status; return $status;
} }
public function checkDBRename($table_index, $column_old, $column_new, $definition, $test = null) public function checkDBRename($table_name, $column_old, $column_new, $definition, $test = null)
{ {
global $core; if (!$this->existsColumn($table_name, $column_old)) {
return Maintenance::ABNORMAL;
}
$status = $this->checkDB( $status = $this->checkDB(
// TEST query // TEST query
'DESCRIBE `' . $core->tables[$table_index] . '` `' . $column_old . '`', 'DESCRIBE `' . $table_name . '` `' . $column_old . '`',
// TEST output // TEST output
$test, $test,
// FIX query // FIX query
'ALTER TABLE `' . $core->tables[$table_index] . '` CHANGE `' . $column_old . '` `' . $column_new . '` ' . $definition 'ALTER TABLE `' . $table_name . '` CHANGE `' . $column_old . '` `' . $column_new . '` ' . $definition
); );
$this->lastMessage = "Renamed column $column_old to $column_new for $table_index"; $this->lastMessage = "Renamed column $column_old to $column_new for $table_name";
return $status; return $status;
} }
public function checkDBRetype($table_index, $column, $new_type, $definition) public function checkDBRetype($table_name, $column, $new_type, $definition)
{ {
global $core; if (!$this->existsColumn($table_name, $column_old)) {
return Maintenance::ABNORMAL;
}
$status = $this->checkDB( $status = $this->checkDB(
// TEST query // TEST query
'DESCRIBE `' . $core->tables[$table_index] . '` `' . $column . '`', 'DESCRIBE `' . $table_name . '` `' . $column . '`',
// TEST output // TEST output
array('type' => strtolower($new_type)), array('type' => strtolower($new_type)),
// FIX query // FIX query
'ALTER TABLE `' . $core->tables[$table_index] . '` CHANGE `' . $column . '` `' . $column . '` ' . $definition 'ALTER TABLE `' . $table_name . '` CHANGE `' . $column . '` `' . $column . '` ' . $definition
); );
$this->lastMessage = "Changed type of column $column for tabke $table_index to tyoe " . strtoupper($new_type); $this->lastMessage = "Changed type of column $column for table " . strtoupper($table_name) . " to tyoe " . strtoupper($new_type);
return $status; return $status;
} }
public function checkDBRemove($table_index, $column) public function checkDBRemove($table_name, $column)
{ {
global $core;
$status = $this->checkDB( $status = $this->checkDB(
// TEST query // TEST query
'DESCRIBE `' . $core->tables[$table_index] . '` `' . $column . '`', 'DESCRIBE `' . $table_name . '` `' . $column . '`',
// TEST output // TEST output
NULL, NULL,
// FIX query // FIX query
'ALTER TABLE `' . $core->tables[$table_index] . '` DROP COLUMN `' . $column . '`' 'ALTER TABLE `' . $table_name . '` DROP COLUMN `' . $column . '`'
); );
$this->lastMessage = "Removed column $column for $table_index"; $this->lastMessage = "Removed column $column for " . strtoupper($table_name);
return $status; return $status;
} }
public function dropKey($table_index, $key) public function addKey($table_name, $key)
{ {
global $core; $test = 'SHOW INDEX FROM `' . $table_name . '` WHERE column_name = "' . $key . '"';
$test = 'SHOW INDEX FROM `' . $core->tables[$table_index] . '` WHERE column_name = "' . $key . '"'; $test_out = array('table' => $table_name);
if ($this->testDB($test, $test_out)) {
$status = Maintenance::OK;
} else {
$fix = 'CREATE INDEX `' . $key . '` ON `' . $table_name . '` (`' . $key . '`)';
$this->dbh->query($fix);
if ($this->testDB($test, $test_out)) {
$status = Maintenance::FIXED;
} else {
$status = Maintenance::FIX_FAILED;
}
}
$this->lastMessage = 'Added KEY ' . $key . ' for ' . strtoupper($table_name);
return $status;
}
public function dropKey($table_name, $key)
{
$test = 'SHOW INDEX FROM `' . $table_name . '` WHERE column_name = "' . $key . '"';
$test_out = null; $test_out = null;
if ($this->testDB($test, $test_out)) { if ($this->testDB($test, $test_out)) {
$status = Maintenance::OK; $status = Maintenance::OK;
} else { } else {
$index_name = $core->dbh->getRow('SHOW INDEX FROM `' . $core->tables[$table_index] . '` WHERE column_name = "' . $key . '"')['key_name']; $index_info = $this->dbh->getRow('SHOW INDEX FROM `' . $table_name . '` WHERE column_name = "' . $key . '"');
$fix = 'ALTER TABLE `' . $core->tables[$table_index] . '` DROP INDEX ' . $index_name; $index_info = array_change_key_case($index_info, CASE_LOWER);
$core->dbh->query($fix); $index_name = $index_info['key_name'];
$fix = 'ALTER TABLE `' . $table_name . '` DROP INDEX `' . $index_name . '`';
$this->dbh->query($fix);
if ($this->testDB($test, $test_out)) { if ($this->testDB($test, $test_out)) {
$status = Maintenance::FIXED; $status = Maintenance::FIXED;
} else { } else {
$status = Maintenance::FIX_FAILED; $status = Maintenance::FIX_FAILED;
} }
} }
$this->lastMessage = 'Deleted KEY ' . $key . ' for ' . $table_index; $this->lastMessage = 'Deleted KEY ' . $key . ' for ' . strtoupper($table_name);
return $status;
}
public function addKey($table_index, $key)
{
global $core;
$test = 'SHOW INDEX FROM `' . $core->tables[$table_index] . '` WHERE column_name = "' . $key . '"';
$test_out = array('table' => $core->tables[$table_index]);
if ($this->testDB($test, $test_out)) {
$status = Maintenance::OK;
} else {
$fix = 'CREATE INDEX `' . $key . '` ON `' . $core->tables[$table_index] . '` (`' . $key . '`)';
$core->dbh->query($fix);
if ($this->testDB($test, $test_out)) {
$status = Maintenance::FIXED;
} else {
$status = Maintenance::FIX_FAILED;
}
}
$this->lastMessage = 'Added KEY ' . $key . ' for ' . $table_index;
return $status; return $status;
} }
public function updateDB($test, $test_out, $update) public function updateDB($test, $test_out, $update)
{ {
global $core;
if (!$this->testDB($test, $test_out)) { if (!$this->testDB($test, $test_out)) {
return Maintenance::OK; return Maintenance::OK;
} else { } else {
$suc = $core->dbh->query($update); $suc = $this->dbh->query($update);
if ($suc !== false) { if ($suc !== false) {
return Maintenance::UPDATED; return Maintenance::UPDATED;
} else { } else {

41
test/test4.php Normal file
View File

@ -0,0 +1,41 @@
<?php
require_once __DIR__.'/../src/DBmodel.php';
require_once __DIR__.'/../src/Maintenance.php';
$db = new \TPsoft\DBmodel\DBmodel('mysql:host=127.0.0.1;dbname=test;charset=utf8mb4', 'test', 'test');
$maintenance = new \TPsoft\DBmodel\Maintenance($db);
$suc = $maintenance->checkDBTable('users', '
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(255) DEFAULT NULL,
`email` varchar(255) DEFAULT NULL,
PRIMARY KEY (`id`)
');
echo "\nCheckDBTable: "; var_dump($suc);
$suc = $maintenance->checkDBAdd('users', 'password', 'varchar(255) DEFAULT NULL');
echo "\nCheckDBAdd: "; var_dump($suc);
$suc = $maintenance->existsColumn('users', 'email');
echo "\nExistsColumn: "; var_dump($suc);
$suc = $maintenance->checkDBRename('users', 'email', 'email_new', 'varchar(255) DEFAULT NULL');
echo "\nCheckDBRename: "; var_dump($suc);
$suc = $maintenance->checkDBRetype('users', 'email_new', 'varchar(128)', 'varchar(128) DEFAULT NULL AFTER `password`');
echo "\nCheckDBRetype: "; var_dump($suc);
$suc = $maintenance->checkDBRemove('users', 'email_new');
echo "\nCheckDBRemove: "; var_dump($suc);
$suc = $maintenance->addKey('users', 'name');
echo "\nAddKey: "; var_dump($suc);
$suc = $maintenance->dropKey('users', 'name');
echo "\nDropKey: "; var_dump($suc);
echo "\nDone\n\n";
?>