Files
ITL-Huge/application/model/TableModel.php
2026-01-12 10:41:05 +01:00

284 lines
8.8 KiB
PHP

<?php
/**
* Class TableModel
*
* Model for table operations using PDO
*/
class TableModel
{
/**
* Get table rows with pagination
* @param string $database_name
* @param string $table_name
* @param int $page
* @param int $per_page
* @return array
*/
public static function getTableRows($database_name, $table_name, $page = 1, $per_page = 20)
{
$database = DatabaseFactory::getFactory()->getConnection();
$offset = ($page - 1) * $per_page;
$sql = "SELECT * FROM `" . $database_name . "`.`" . $table_name . "` LIMIT :offset, :per_page";
$query = $database->prepare($sql);
$query->bindParam(':offset', $offset, PDO::PARAM_INT);
$query->bindParam(':per_page', $per_page, PDO::PARAM_INT);
$query->execute();
return $query->fetchAll(PDO::FETCH_ASSOC);
}
/**
* Get total number of rows in a table
* @param string $database_name
* @param string $table_name
* @return int
*/
public static function getTableRowCount($database_name, $table_name)
{
$database = DatabaseFactory::getFactory()->getConnection();
$sql = "SELECT COUNT(*) as count FROM `" . $database_name . "`.`" . $table_name . "`";
$query = $database->prepare($sql);
$query->execute();
$result = $query->fetch(PDO::FETCH_ASSOC);
return (int)$result['count'];
}
/**
* Get table column information
* @param string $database_name
* @param string $table_name
* @return array
*/
public static function getTableColumns($database_name, $table_name)
{
$database = DatabaseFactory::getFactory()->getConnection();
$sql = "SHOW COLUMNS FROM `" . $database_name . "`.`" . $table_name . "`";
$query = $database->prepare($sql);
$query->execute();
return $query->fetchAll(PDO::FETCH_ASSOC);
}
/**
* Get table indexes
* @param string $database_name
* @param string $table_name
* @return array
*/
public static function getTableIndexes($database_name, $table_name)
{
$database = DatabaseFactory::getFactory()->getConnection();
$sql = "SHOW INDEX FROM `" . $database_name . "`.`" . $table_name . "`";
$query = $database->prepare($sql);
$query->execute();
return $query->fetchAll(PDO::FETCH_ASSOC);
}
/**
* Get table information
* @param string $database_name
* @param string $table_name
* @return array
*/
public static function getTableInfo($database_name, $table_name)
{
$database = DatabaseFactory::getFactory()->getConnection();
$sql = "SHOW TABLE STATUS FROM `" . $database_name . "` LIKE :table_name";
$query = $database->prepare($sql);
$query->execute(array(':table_name' => $table_name));
$result = $query->fetch(PDO::FETCH_ASSOC);
if ($result) {
return array(
'engine' => $result['Engine'],
'rows' => $result['Rows'],
'data_size' => self::formatBytes($result['Data_length']),
'index_size' => self::formatBytes($result['Index_length']),
'total_size' => self::formatBytes($result['Data_length'] + $result['Index_length']),
'collation' => $result['Collation'],
'comment' => $result['Comment'],
'auto_increment' => $result['Auto_increment'],
'create_time' => $result['Create_time'],
'update_time' => $result['Update_time']
);
}
return array();
}
/**
* Create a new table
* @param string $database_name
* @param string $table_name
* @param array $columns
* @return bool
*/
public static function createTable($database_name, $table_name, $columns)
{
if (!$database_name || !$table_name || empty($columns)) {
return false;
}
$database = DatabaseFactory::getFactory()->getConnection();
// Build column definitions
$column_definitions = array();
foreach ($columns as $column) {
$definition = "`" . $column['name'] . "` " . $column['type'];
if (isset($column['null']) && $column['null'] === 'NO') {
$definition .= " NOT NULL";
}
if (isset($column['default']) && $column['default'] !== '') {
$definition .= " DEFAULT '" . $column['default'] . "'";
}
if (isset($column['extra']) && $column['extra'] === 'auto_increment') {
$definition .= " AUTO_INCREMENT";
}
$column_definitions[] = $definition;
}
// Handle primary key
foreach ($columns as $column) {
if (isset($column['key']) && $column['key'] === 'PRI') {
$column_definitions[] = "PRIMARY KEY (`" . $column['name'] . "`)";
break;
}
}
$columns_sql = implode(', ', $column_definitions);
try {
$sql = "CREATE TABLE `" . $database_name . "`.`" . $table_name . "` (" . $columns_sql . ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci";
$query = $database->prepare($sql);
return $query->execute();
} catch (PDOException $e) {
return false;
}
}
/**
* Delete a table
* @param string $database_name
* @param string $table_name
* @return bool
*/
public static function deleteTable($database_name, $table_name)
{
if (!$database_name || !$table_name) {
return false;
}
$database = DatabaseFactory::getFactory()->getConnection();
try {
$sql = "DROP TABLE `" . $database_name . "`.`" . $table_name . "`";
$query = $database->prepare($sql);
return $query->execute();
} catch (PDOException $e) {
return false;
}
}
/**
* Add a column to a table
* @param string $database_name
* @param string $table_name
* @param string $column_name
* @param string $column_type
* @param string $column_null
* @param string $column_key
* @param string $column_default
* @param string $column_extra
* @return bool
*/
public static function addColumn($database_name, $table_name, $column_name, $column_type, $column_null, $column_key, $column_default, $column_extra)
{
if (!$database_name || !$table_name || !$column_name || !$column_type) {
return false;
}
$database = DatabaseFactory::getFactory()->getConnection();
$definition = "`" . $column_name . "` " . $column_type;
if ($column_null === 'NO') {
$definition .= " NOT NULL";
}
if ($column_default !== '') {
$definition .= " DEFAULT '" . $column_default . "'";
}
if ($column_extra === 'auto_increment') {
$definition .= " AUTO_INCREMENT";
}
try {
$sql = "ALTER TABLE `" . $database_name . "`.`" . $table_name . "` ADD " . $definition;
$query = $database->prepare($sql);
return $query->execute();
} catch (PDOException $e) {
return false;
}
}
/**
* Drop a column from a table
* @param string $database_name
* @param string $table_name
* @param string $column_name
* @return bool
*/
public static function dropColumn($database_name, $table_name, $column_name)
{
if (!$database_name || !$table_name || !$column_name) {
return false;
}
$database = DatabaseFactory::getFactory()->getConnection();
try {
$sql = "ALTER TABLE `" . $database_name . "`.`" . $table_name . "` DROP COLUMN `" . $column_name . "`";
$query = $database->prepare($sql);
return $query->execute();
} catch (PDOException $e) {
return false;
}
}
/**
* Format bytes to human readable format
* @param int $bytes
* @return string
*/
private static function formatBytes($bytes)
{
if ($bytes >= 1073741824) {
return number_format($bytes / 1073741824, 2) . ' GB';
} elseif ($bytes >= 1048576) {
return number_format($bytes / 1048576, 2) . ' MB';
} elseif ($bytes >= 1024) {
return number_format($bytes / 1024, 2) . ' KB';
} elseif ($bytes > 1) {
return $bytes . ' bytes';
} elseif ($bytes == 1) {
return '1 byte';
} else {
return '0 bytes';
}
}
}