Finished messenger

This commit is contained in:
2026-01-12 10:41:05 +01:00
parent 674fabb715
commit a4d386f2c5
11 changed files with 2069 additions and 426 deletions

View File

@@ -0,0 +1,183 @@
<?php
/**
* Class DatabaseModel
*
* Model for database operations using PDO
*/
class DatabaseModel
{
/**
* Get all databases on the server
* @return array
*/
public static function getAllDatabases()
{
$database = DatabaseFactory::getFactory()->getConnection();
$sql = "SHOW DATABASES";
$query = $database->prepare($sql);
$query->execute();
$databases = $query->fetchAll(PDO::FETCH_COLUMN);
// Filter out system databases
$system_dbs = ['information_schema', 'performance_schema', 'mysql', 'sys'];
return array_diff($databases, $system_dbs);
}
/**
* Get all tables in a specific database
* @param string $database_name
* @return array
*/
public static function getTablesInDatabase($database_name)
{
$database = DatabaseFactory::getFactory()->getConnection();
$sql = "SHOW TABLES FROM " . $database_name;
$query = $database->prepare($sql);
$query->execute();
return $query->fetchAll(PDO::FETCH_COLUMN);
}
/**
* Get detailed information about tables in a database
* @param string $database_name
* @return array
*/
public static function getTableDetails($database_name)
{
$database = DatabaseFactory::getFactory()->getConnection();
$tables = self::getTablesInDatabase($database_name);
$table_details = array();
foreach ($tables as $table) {
$sql = "SHOW TABLE STATUS FROM " . $database_name . " LIKE :table_name";
$query = $database->prepare($sql);
$query->execute(array(':table_name' => $table));
$details = $query->fetch(PDO::FETCH_ASSOC);
if ($details) {
$table_details[$table] = array(
'engine' => $details['Engine'],
'rows' => $details['Rows'],
'data_size' => self::formatBytes($details['Data_length']),
'index_size' => self::formatBytes($details['Index_length']),
'total_size' => self::formatBytes($details['Data_length'] + $details['Index_length']),
'collation' => $details['Collation'],
'comment' => $details['Comment']
);
}
}
return $table_details;
}
/**
* Get complete database structure (tables and columns)
* @param string $database_name
* @return array
*/
public static function getDatabaseStructure($database_name)
{
$database = DatabaseFactory::getFactory()->getConnection();
$structure = array();
$tables = self::getTablesInDatabase($database_name);
foreach ($tables as $table) {
$sql = "DESCRIBE " . $database_name . "." . $table;
$query = $database->prepare($sql);
$query->execute();
$columns = $query->fetchAll(PDO::FETCH_ASSOC);
$structure[$table] = $columns;
}
return $structure;
}
/**
* Create a new database
* @param string $database_name
* @return bool
*/
public static function createDatabase($database_name)
{
if (!$database_name || !preg_match('/^[a-zA-Z0-9_]+$/', $database_name)) {
return false;
}
$database = DatabaseFactory::getFactory()->getConnection();
try {
$sql = "CREATE DATABASE `" . $database_name . "` CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci";
$query = $database->prepare($sql);
return $query->execute();
} catch (PDOException $e) {
return false;
}
}
/**
* Delete a database
* @param string $database_name
* @return bool
*/
public static function deleteDatabase($database_name)
{
if (!$database_name) {
return false;
}
$database = DatabaseFactory::getFactory()->getConnection();
try {
$sql = "DROP DATABASE `" . $database_name . "`";
$query = $database->prepare($sql);
return $query->execute();
} catch (PDOException $e) {
return false;
}
}
/**
* Get table columns with details
* @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);
}
/**
* 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';
}
}
}