1
0
Fork 0
MySQLDumper/application/models/Databases.php

250 Zeilen
7.1 KiB
PHP

<?php
/**
* This file is part of MySQLDumper released under the GNU/GPL 2 license
* http://www.mysqldumper.net
*
* @package MySQLDumper
* @subpackage Sql
* @version SVN: $Rev$
* @author $Author$
*/
/**
* Database management
*
* Model to manage the databases (CREATE, "TRUNCATE" and DROP).
*
* @package MySQLDumper
* @subpackage Sqlbox
*/
class Application_Model_Databases
{
/**
* @var Msd_Db_MysqlCommon Connection to database.
*/
private $_db = null;
/**
* @var string Name of the current database.
*/
private $_dbName = '';
/**
* Class constructor.
*
* @return void
*/
public function __construct(Msd_Db $db)
{
$this->_db = $db;
}
/**
* Drops databases. The names are given in the argument.
*
* @param array|string $databaseNames
*
* @return array
*/
public function dropDatabases($databaseNames)
{
if (is_string($databaseNames)) {
$databaseNames = (array) $databaseNames;
}
$dropSql = 'DROP DATABASE `%s`;';
$results = array();
foreach ($databaseNames as $databaseName) {
$errorInfo = array();
$dropQuery = sprintf(
$dropSql,
$databaseName
);
try {
$result = $this->_db->query(
$dropQuery,
Msd_Db::SIMPLE
);
if (!$result) {
$errorInfo = $this->_db->getLastError();
}
} catch (Msd_Exception $e) {
$result = false;
$errorInfo = array(
'code' => $e->getCode(),
'message' => $e->getMessage(),
);
}
$results[$databaseName][] = array(
'result' => $result,
'query' => $dropQuery,
'errorInfo' => $errorInfo,
);
}
return $results;
}
/**
* Gets the stored procedures. Returns an array in format
* ROUTINE_NAME => ROUTINE_TYPE.
*
* @param string $dbName Name of the database
*
* @return array
*/
private function _getStoredProcedures($dbName)
{
$routinesMeta = $this->_db->getStoredProcedures($dbName);
$routines = array();
foreach ($routinesMeta as $routine) {
$routines[$routine['ROUTINE_NAME']] = $routine['ROUTINE_TYPE'];
}
return $routines;
}
/**
* Tries to drop all stored routines.
*
* @param array $routines Array with the routine names.
*
* @return array
*/
public function dropRoutines($routines)
{
$results = array();
$dropSql = 'DROP %s `%s`.`%s`;';
foreach ($routines as $routineName => $routineType) {
$dropQuery = sprintf(
$dropSql,
$routineType,
$this->_dbName,
$routineName
);
$errorInfo = array();
try {
$result = $this->_db->query($dropQuery, Msd_Db::SIMPLE);
if (!$result) {
$errorInfo = $this->_db->getLastError();
}
} catch (Msd_Exception $e) {
$result = false;
$errorInfo = array(
'code' => $e->getCode(),
'message' => $e->getMessage(),
);
}
$results[$this->_dbName][] = array(
'result' => $result,
'query' => $dropQuery,
'errorInfo' => $errorInfo,
);
}
return $results;
}
/**
* Tries to drop all views.
*
* @param array $views Array with the names of the views
*
* @return array
*/
public function dropViews($views)
{
$results = array();
$dropSql = 'DROP VIEW `%s`.`%s`;';
foreach ($views as $view) {
$dropQuery = sprintf($dropSql, $this->_dbName, $view);
$errorInfo = array();
try {
$result = $this->_db->query($dropQuery, Msd_Db::SIMPLE);
if (!$result) {
$errorInfo = $this->_db->getLastError();
}
} catch (Msd_Exception $e) {
$result = false;
$errorInfo = array(
'code' => $e->getCode(),
'message' => $e->getMessage(),
);
}
$results[$this->_dbName][] = array(
'result' => $result,
'query' => $dropQuery,
'errorInfo' => $errorInfo,
);
}
return $results;
}
/**
* Tries to drop all tables.
*
* @param array $tables Array with table names to drop
* @return array
*/
public function dropTables($tables)
{
$results = array();
$dropSql = 'DROP TABLE `%s`.`%s`;';
foreach ($tables as $table) {
$errorInfo = array();
$dropQuery = sprintf($dropSql, $this->_dbName, $table);
try {
$result = $this->_db->query($dropQuery, Msd_Db::SIMPLE);
if (!$result) {
$errorInfo = $this->_db->getLastError();
}
} catch (Msd_Exception $e) {
$result = false;
$errorInfo = array(
'code' => $e->getCode(),
'message' => $e->getMessage(),
);
}
$results[$this->_dbName][] = array(
'result' => $result,
'query' => $dropQuery,
'errorInfo' => $errorInfo,
);
}
return $results;
}
/**
* Truncates a database. It drops all stored routines, views and tables
* (in that order).
*
* @param string $databaseName Name of the database
*
* @return array
*/
public function truncateDatabase($databaseName)
{
$this->_dbName = $databaseName;
$routines = $this->_getStoredProcedures($databaseName);
$procResults = $this->dropRoutines($routines);
$views = $this->_db->getViews($databaseName);
$viewsResults = $this->dropViews(array_keys($views));
$tables = $this->_db->getTablesMeta($databaseName);
$tablesResults = $this->dropTables(array_keys($tables));
$results = array();
if (array_key_exists($databaseName, $procResults)) {
foreach ($procResults[$databaseName] as $procResult) {
$results[$databaseName][] = $procResult;
}
}
if (array_key_exists($databaseName, $viewsResults)) {
foreach ($viewsResults[$databaseName] as $viewsResult) {
$results[$databaseName][] = $viewsResult;
}
}
if (array_key_exists($databaseName, $tablesResults)) {
foreach ($tablesResults[$databaseName] as $tablesResult) {
$results[$databaseName][] = $tablesResult;
}
}
return $results;
}
}