1
0
This repository has been archived on 2021-04-26. You can view files and clone it, but cannot push or open issues or pull requests.
gallery3-contrib/3.0/obsolete/web_client/system/libraries/Database_Mysql.php

229 lines
6.0 KiB
PHP

<?php defined('SYSPATH') or die('No direct script access.');
/**
* MySQL database connection.
*
* $Id: Database_Mysql.php 4712 2009-12-10 21:47:09Z cbandy $
*
* @package Kohana
* @author Kohana Team
* @copyright (c) 2008-2009 Kohana Team
* @license http://kohanaphp.com/license
*/
class Database_Mysql_Core extends Database {
// Quote character to use for identifiers (tables/columns/aliases)
protected $quote = '`';
// Use SET NAMES to set the character set
protected static $set_names;
public function connect()
{
if ($this->connection)
return;
if (Database_Mysql::$set_names === NULL)
{
// Determine if we can use mysql_set_charset(), which is only
// available on PHP 5.2.3+ when compiled against MySQL 5.0+
Database_Mysql::$set_names = ! function_exists('mysql_set_charset');
}
extract($this->config['connection']);
$host = isset($host) ? $host : $socket;
$port = isset($port) ? ':'.$port : '';
try
{
// Connect to the database
$this->connection = ($this->config['persistent'] === TRUE)
? mysql_pconnect($host.$port, $user, $pass, $params)
: mysql_connect($host.$port, $user, $pass, TRUE, $params);
}
catch (Kohana_PHP_Exception $e)
{
// No connection exists
$this->connection = NULL;
// Unable to connect to the database
throw new Database_Exception('#:errno: :error',
array(':error' => mysql_error(),
':errno' => mysql_errno()));
}
if ( ! mysql_select_db($database, $this->connection))
{
// Unable to select database
throw new Database_Exception('#:errno: :error',
array(':error' => mysql_error($this->connection),
':errno' => mysql_errno($this->connection)));
}
if (isset($this->config['character_set']))
{
// Set the character set
$this->set_charset($this->config['character_set']);
}
}
public function disconnect()
{
try
{
// Database is assumed disconnected
$status = TRUE;
if (is_resource($this->connection))
{
$status = mysql_close($this->connection);
}
}
catch (Exception $e)
{
// Database is probably not disconnected
$status = is_resource($this->connection);
}
return $status;
}
public function set_charset($charset)
{
// Make sure the database is connected
$this->connection or $this->connect();
if (Database_Mysql::$set_names === TRUE)
{
// PHP is compiled against MySQL 4.x
$status = (bool) mysql_query('SET NAMES '.$this->quote($charset), $this->connection);
}
else
{
// PHP is compiled against MySQL 5.x
$status = mysql_set_charset($charset, $this->connection);
}
if ($status === FALSE)
{
// Unable to set charset
throw new Database_Exception('#:errno: :error',
array(':error' => mysql_error($this->connection),
':errno' => mysql_errno($this->connection)));
}
}
public function query_execute($sql)
{
// Make sure the database is connected
$this->connection or $this->connect();
$result = mysql_query($sql, $this->connection);
// Set the last query
$this->last_query = $sql;
return new Database_Mysql_Result($result, $sql, $this->connection, $this->config['object']);
}
public function escape($value)
{
// Make sure the database is connected
$this->connection or $this->connect();
if (($value = mysql_real_escape_string($value, $this->connection)) === FALSE)
{
throw new Database_Exception('#:errno: :error',
array(':error' => mysql_error($this->connection),
':errno' => mysql_errno($this->connection)));
}
return $value;
}
public function list_constraints($table)
{
$prefix = strlen($this->table_prefix());
$result = array();
$constraints = $this->query('
SELECT c.constraint_name, c.constraint_type, k.column_name, k.referenced_table_name, k.referenced_column_name
FROM information_schema.table_constraints c
JOIN information_schema.key_column_usage k ON (k.table_schema = c.table_schema AND k.table_name = c.table_name AND k.constraint_name = c.constraint_name)
WHERE c.table_schema = '.$this->quote($this->config['connection']['database']).'
AND c.table_name = '.$this->quote($this->table_prefix().$table).'
AND (k.referenced_table_schema IS NULL OR k.referenced_table_schema ='.$this->quote($this->config['connection']['database']).')
ORDER BY k.ordinal_position
');
foreach ($constraints->as_array() as $row)
{
switch ($row['constraint_type'])
{
case 'FOREIGN KEY':
if (isset($result[$row['constraint_name']]))
{
$result[$row['constraint_name']][1][] = $row['column_name'];
$result[$row['constraint_name']][3][] = $row['referenced_column_name'];
}
else
{
$result[$row['constraint_name']] = array($row['constraint_type'], array($row['column_name']), substr($row['referenced_table_name'], $prefix), array($row['referenced_column_name']));
}
break;
case 'PRIMARY KEY':
case 'UNIQUE':
if (isset($result[$row['constraint_name']]))
{
$result[$row['constraint_name']][1][] = $row['column_name'];
}
else
{
$result[$row['constraint_name']] = array($row['constraint_type'], array($row['column_name']));
}
break;
}
}
return $result;
}
public function list_fields($table)
{
$result = array();
foreach ($this->query('SHOW COLUMNS FROM '.$this->quote_table($table))->as_array() as $row)
{
$column = $this->sql_type($row['Type']);
$column['default'] = $row['Default'];
$column['nullable'] = $row['Null'] === 'YES';
$column['sequenced'] = $row['Extra'] === 'auto_increment';
if (isset($column['length']) AND $column['type'] === 'float')
{
list($column['precision'], $column['scale']) = explode(',', $column['length']);
}
$result[$row['Field']] = $column;
}
return $result;
}
public function list_tables()
{
$prefix = strlen($this->table_prefix());
$tables = array();
foreach ($this->query('SHOW TABLES FROM '.$this->escape($this->config['connection']['database']).' LIKE '.$this->quote($this->table_prefix().'%'))->as_array() as $row)
{
// The value is the table name
$tables[] = substr(current($row), $prefix);
}
return $tables;
}
} // End Database_MySQL