2005-07-04 01:07:14 +00:00
< ? php
2005-08-21 06:49:02 +00:00
/* SVN FILE: $Id$ */
2005-06-12 20:50:12 +00:00
/**
2005-08-21 06:49:02 +00:00
* PostgreSQL layer for DBO .
2006-01-12 02:10:47 +00:00
*
2005-08-21 06:49:02 +00:00
* Long description for file
*
* PHP versions 4 and 5
*
* CakePHP : Rapid Development Framework < http :// www . cakephp . org />
2006-01-20 07:46:14 +00:00
* Copyright ( c ) 2006 , Cake Software Foundation , Inc .
2005-12-23 21:57:26 +00:00
* 1785 E . Sahara Avenue , Suite 490 - 204
* Las Vegas , Nevada 89104
2005-08-21 06:49:02 +00:00
*
2005-12-23 21:57:26 +00:00
* Licensed under The MIT License
* Redistributions of files must retain the above copyright notice .
2005-08-21 06:49:02 +00:00
*
2006-01-12 02:10:47 +00:00
* @ filesource
2006-01-20 07:46:14 +00:00
* @ copyright Copyright ( c ) 2006 , Cake Software Foundation , Inc .
2005-12-23 21:57:26 +00:00
* @ link http :// www . cakefoundation . org / projects / info / cakephp CakePHP Project
2005-08-21 06:49:02 +00:00
* @ package cake
2006-01-12 02:10:47 +00:00
* @ subpackage cake . cake . libs . model . datasources . dbo
2005-08-21 06:49:02 +00:00
* @ since CakePHP v 0.9 . 1.114
* @ version $Revision $
* @ modifiedby $LastChangedBy $
* @ lastmodified $Date $
* @ license http :// www . opensource . org / licenses / mit - license . php The MIT License
*/
2005-06-12 20:50:12 +00:00
/**
* Include DBO .
*/
2006-01-12 02:10:47 +00:00
uses ( 'model' . DS . 'datasources' . DS . 'dbo_source' );
2005-06-12 20:50:12 +00:00
/**
2005-09-07 01:52:45 +00:00
* PostgreSQL layer for DBO .
2006-01-12 02:10:47 +00:00
*
2005-08-21 06:49:02 +00:00
* Long description for class
*
* @ package cake
2006-01-12 02:10:47 +00:00
* @ subpackage cake . cake . libs . model . datasources . dbo
2005-08-21 06:49:02 +00:00
* @ since CakePHP v 0.9 . 1.114
*/
2006-01-12 02:10:47 +00:00
class DboPostgres extends DboSource
2005-06-14 19:57:01 +00:00
{
2006-01-12 02:10:47 +00:00
var $description = " PostgreSQL DBO Driver " ;
var $_baseConfig = array ( 'persistent' => true ,
'host' => 'localhost' ,
'login' => 'root' ,
'password' => '' ,
'database' => 'cake' ,
2006-02-16 09:29:28 +00:00
'port' => 3306 );
2006-01-12 02:10:47 +00:00
var $columns = array (
'primary_key' => array ( 'name' => 'serial primary key' ),
'string' => array ( 'name' => 'varchar' , 'limit' => '255' ),
'text' => array ( 'name' => 'text' ),
'integer' => array ( 'name' => 'integer' ),
'float' => array ( 'name' => 'float' ),
'datetime' => array ( 'name' => 'timestamp' ),
'timestamp' => array ( 'name' => 'timestamp' ),
'time' => array ( 'name' => 'time' ),
'date' => array ( 'name' => 'date' ),
'binary' => array ( 'name' => 'bytea' ),
2006-02-16 09:29:28 +00:00
'boolean' => array ( 'name' => 'boolean' ),
'number' => array ( 'name' => 'numeric' ));
2006-01-12 02:10:47 +00:00
2005-06-12 20:50:12 +00:00
/**
* Connects to the database using options in the given configuration array .
*
* @ return True if successfully connected .
*/
2006-01-12 02:10:47 +00:00
function connect ()
2005-07-10 05:08:19 +00:00
{
2006-01-12 02:10:47 +00:00
$config = $this -> config ;
2006-01-17 17:52:23 +00:00
$connect = $config [ 'connect' ];
2005-07-10 05:08:19 +00:00
2006-01-12 02:10:47 +00:00
$this -> connection = $connect ( " dbname= { $config [ 'database' ] } user= { $config [ 'login' ] } password= { $config [ 'password' ] } " );
if ( $this -> connection )
{
$this -> connected = true ;
}
2005-07-10 05:08:19 +00:00
else
2005-08-21 06:49:02 +00:00
{
2006-01-12 02:10:47 +00:00
$this -> connected = false ;
2005-08-21 06:49:02 +00:00
}
2006-01-12 02:10:47 +00:00
return $this -> connected ;
2005-07-10 05:08:19 +00:00
}
2005-06-12 20:50:12 +00:00
/**
* Disconnects from database .
*
* @ return boolean True if the database could be disconnected , else false
*/
2006-01-12 02:10:47 +00:00
function disconnect ()
2005-07-10 05:08:19 +00:00
{
2006-01-12 02:10:47 +00:00
return pg_close ( $this -> connection );
2005-07-10 05:08:19 +00:00
}
2005-06-12 20:50:12 +00:00
2005-09-14 04:11:56 +00:00
/**
* Executes given SQL statement .
*
* @ param string $sql SQL statement
* @ return resource Result resource identifier
*/
2006-02-01 13:26:23 +00:00
function _execute ( $sql )
2005-07-10 05:08:19 +00:00
{
2006-01-12 02:10:47 +00:00
return pg_query ( $this -> connection , $sql );
}
function query ()
{
$args = func_get_args ();
if ( count ( $args ) == 1 )
{
return $this -> fetchAll ( $args [ 0 ]);
}
elseif ( count ( $args ) > 1 && strpos ( $args [ 0 ], 'findBy' ) === 0 )
{
$field = Inflector :: underscore ( str_replace ( 'findBy' , '' , $args [ 0 ]));
2006-02-16 09:29:28 +00:00
$query = '"' . $args [ 2 ] -> name . '"."' . $field . '" = ' . $this -> value ( $args [ 1 ][ 0 ]);
2006-01-12 02:10:47 +00:00
return $args [ 2 ] -> find ( $query );
}
elseif ( count ( $args ) > 1 && strpos ( $args [ 0 ], 'findAllBy' ) === 0 )
{
$field = Inflector :: underscore ( str_replace ( 'findAllBy' , '' , $args [ 0 ]));
2006-02-16 09:29:28 +00:00
$query = '"' . $args [ 2 ] -> name . '"."' . $field . '" = ' . $this -> value ( $args [ 1 ][ 0 ]);
2006-01-12 02:10:47 +00:00
return $args [ 2 ] -> findAll ( $query );
}
2005-07-10 05:08:19 +00:00
}
2005-06-12 20:50:12 +00:00
2005-09-14 04:11:56 +00:00
/**
* Returns a row from given resultset as an array .
*
* @ return array The fetched row as an array
*/
2006-02-16 09:29:28 +00:00
function fetchRow ( $assoc = false )
2005-07-10 05:08:19 +00:00
{
2006-02-16 09:29:28 +00:00
$assoc = ( $assoc === false ) ? PGSQL_BOTH : PGSQL_ASSOC ;
return pg_fetch_array ( $this -> _result , null , $assoc );
2005-07-10 05:08:19 +00:00
}
2005-06-12 20:50:12 +00:00
2005-09-14 04:11:56 +00:00
/**
* Returns an array of tables in the database . If there are no tables , an error is raised and the application exits .
*
* @ return array Array of tablenames in the database
*/
2006-01-12 02:10:47 +00:00
function listSources ()
2005-07-10 05:08:19 +00:00
{
2006-02-16 09:29:28 +00:00
$sql = " SELECT table_name as name FROM information_schema.tables WHERE table_schema = 'public'; " ;
2005-06-12 20:50:12 +00:00
2006-02-16 09:29:28 +00:00
$result = $this -> query ( $sql );
2005-07-10 05:08:19 +00:00
2006-01-12 02:10:47 +00:00
if ( ! $result )
2005-07-10 05:08:19 +00:00
{
2006-01-12 02:10:47 +00:00
return null ;
2005-07-10 05:08:19 +00:00
}
2006-02-16 09:29:28 +00:00
else
{
$tables = array ();
foreach ( $result as $item )
{
$tables [] = $item [ 'name' ];
}
return $tables ;
}
2005-07-10 05:08:19 +00:00
}
2005-06-12 20:50:12 +00:00
2005-09-14 04:11:56 +00:00
/**
* Returns an array of the fields in given table name .
*
2005-09-18 13:25:20 +00:00
* @ param string $tableName Name of database table to inspect
2005-09-14 04:11:56 +00:00
* @ return array Fields in table . Keys are name and type
*/
2005-09-18 13:25:20 +00:00
function fields ( $tableName )
2005-07-10 05:08:19 +00:00
{
2005-09-18 13:25:20 +00:00
$sql = " SELECT c.relname, a.attname, t.typname FROM pg_class c, pg_attribute a, pg_type t WHERE c.relname = ' { $tableName } ' AND a.attnum > 0 AND a.attrelid = c.oid AND a.atttypid = t.oid " ;
2006-01-12 02:10:47 +00:00
2005-07-10 05:08:19 +00:00
$fields = false ;
foreach ( $this -> all ( $sql ) as $field ) {
$fields [] = array (
'name' => $field [ 'attname' ],
'type' => $field [ 'typname' ]);
}
return $fields ;
}
2005-06-12 20:50:12 +00:00
2006-02-16 09:29:28 +00:00
/**
* Returns an array of the fields in given table name .
*
* @ param string $tableName Name of database table to inspect
* @ return array Fields in table . Keys are name and type
*/
function & describe ( & $model )
{
$cache = parent :: describe ( $model );
if ( $cache != null )
{
return $cache ;
}
$fields = false ;
$fields = $this -> query ( " SELECT column_name as name, data_type as type FROM information_schema.columns WHERE table_name = " . $this -> name ( $model -> table ));
$this -> __cacheDescription ( $model -> table , $fields );
return $fields ;
}
2005-09-14 04:11:56 +00:00
/**
* Returns a quoted and escaped string of $data for use in an SQL statement .
*
* @ param string $data String to be prepared for use in an SQL statement
* @ return string Quoted and escaped
*/
2006-01-12 02:10:47 +00:00
function name ( $data )
{
return " ' " . $data . " ' " ;
}
/**
* Returns a quoted and escaped string of $data for use in an SQL statement .
*
* @ param string $data String to be prepared for use in an SQL statement
* @ return string Quoted and escaped
*/
function value ( $data )
2005-07-10 05:08:19 +00:00
{
2005-09-14 04:11:56 +00:00
return " ' " . pg_escape_string ( $data ) . " ' " ;
2005-07-10 05:08:19 +00:00
}
2005-06-12 20:50:12 +00:00
2005-09-14 04:11:56 +00:00
/**
* Returns a formatted error message from previous database operation .
*
* @ return string Error message
*/
2006-01-12 02:10:47 +00:00
function lastError ()
2005-07-10 05:08:19 +00:00
{
2006-01-12 02:10:47 +00:00
$last_error = pg_last_error ( $this -> connection );
if ( $last_error )
{
return $last_error ;
}
return null ;
2005-07-10 05:08:19 +00:00
}
2005-06-12 20:50:12 +00:00
2005-09-14 04:11:56 +00:00
/**
* Returns number of affected rows in previous database operation . If no previous operation exists , this returns false .
*
* @ return int Number of affected rows
*/
2005-07-10 05:08:19 +00:00
function lastAffected ()
{
2006-01-12 02:10:47 +00:00
if ( $this -> _result )
{
return pg_affected_rows ( $this -> _result );
}
return false ;
2005-07-10 05:08:19 +00:00
}
2005-06-12 20:50:12 +00:00
2005-09-14 04:11:56 +00:00
/**
2006-01-12 02:10:47 +00:00
* Returns number of rows in previous resultset . If no previous resultset exists ,
2005-09-14 04:11:56 +00:00
* this returns false .
*
* @ return int Number of rows in resultset
*/
2006-01-12 02:10:47 +00:00
function lastNumRows ()
2005-07-10 05:08:19 +00:00
{
2006-01-12 02:10:47 +00:00
if ( $this -> _result )
{
return pg_num_rows ( $this -> _result );
}
return false ;
2005-07-10 05:08:19 +00:00
}
2005-06-12 20:50:12 +00:00
2005-09-14 04:11:56 +00:00
/**
* Returns the ID generated from the previous INSERT operation .
*
2006-01-12 02:10:47 +00:00
* @ param string $source Name of the database table
2005-09-14 04:11:56 +00:00
* @ param string $field Name of the ID database field . Defaults to " id "
2006-01-12 02:10:47 +00:00
* @ return int
2005-09-14 04:11:56 +00:00
*/
2006-01-12 02:10:47 +00:00
function lastInsertId ( $source , $field = 'id' )
2005-07-10 05:08:19 +00:00
{
2006-01-12 02:10:47 +00:00
$sql = " SELECT CURRVAL(' { $source } _ { $field } _seq') AS max " ;
2005-07-10 05:08:19 +00:00
$res = $this -> rawQuery ( $sql );
$data = $this -> fetchRow ( $res );
return $data [ 'max' ];
}
2005-09-14 04:11:56 +00:00
/**
* Returns a limit statement in the correct format for the particular database .
*
* @ param int $limit Limit of results returned
* @ param int $offset Offset from which to start results
* @ return string SQL limit / offset statement
*/
2006-01-12 02:10:47 +00:00
function limit ( $limit , $offset = null )
2005-07-10 05:08:19 +00:00
{
2006-01-12 02:10:47 +00:00
$rt = ' LIMIT ' . $limit ;
if ( $offset )
{
$rt .= ' OFFSET ' . $offset ;
}
return $rt ;
2005-07-10 05:08:19 +00:00
}
2005-06-14 19:57:01 +00:00
2005-06-12 20:50:12 +00:00
}
2005-05-16 23:14:37 +00:00
?>