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
*
2007-02-02 10:39:45 +00:00
* CakePHP ( tm ) : Rapid Development Framework < http :// www . cakephp . org />
2008-01-01 22:18:17 +00:00
* Copyright 2005 - 2008 , Cake Software Foundation , Inc .
2006-05-26 05:29:17 +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
2008-01-01 22:18:17 +00:00
* @ copyright Copyright 2005 - 2008 , Cake Software Foundation , Inc .
2007-02-02 10:39:45 +00:00
* @ link http :// www . cakefoundation . org / projects / info / cakephp CakePHP ( tm ) Project
2006-05-26 05:29:17 +00:00
* @ package cake
2006-12-01 02:34:56 +00:00
* @ subpackage cake . cake . libs . model . datasources . dbo
2007-02-02 10:39:45 +00:00
* @ since CakePHP ( tm ) v 0.9 . 1.114
2006-05-26 05:29:17 +00:00
* @ version $Revision $
* @ modifiedby $LastChangedBy $
* @ lastmodified $Date $
* @ license http :// www . opensource . org / licenses / mit - license . php The MIT License
2005-08-21 06:49:02 +00:00
*/
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
*
2006-05-26 05:29:17 +00:00
* @ package cake
2006-12-01 02:34:56 +00:00
* @ subpackage cake . cake . libs . model . datasources . dbo
2005-08-21 06:49:02 +00:00
*/
2006-11-01 06:14:50 +00:00
class DboPostgres extends DboSource {
2006-05-26 05:29:17 +00:00
var $description = " PostgreSQL DBO Driver " ;
2006-06-15 18:38:32 +00:00
var $_baseConfig = array (
2006-08-01 21:58:13 +00:00
'connect' => 'pg_pconnect' ,
2006-06-15 18:38:32 +00:00
'persistent' => true ,
'host' => 'localhost' ,
'login' => 'root' ,
'password' => '' ,
'database' => 'cake' ,
2007-05-14 00:15:44 +00:00
'schema' => 'public' ,
2007-03-16 14:23:54 +00:00
'port' => 5432 ,
'encoding' => ''
2006-06-15 18:38:32 +00:00
);
2006-05-26 05:29:17 +00:00
2006-11-01 06:14:50 +00:00
var $columns = array (
'primary_key' => array ( 'name' => 'serial NOT NULL' ),
'string' => array ( 'name' => 'varchar' , 'limit' => '255' ),
'text' => array ( 'name' => 'text' ),
2007-04-12 07:46:29 +00:00
'integer' => array ( 'name' => 'integer' , 'formatter' => 'intval' ),
'float' => array ( 'name' => 'float' , 'formatter' => 'floatval' ),
'datetime' => array ( 'name' => 'timestamp' , 'format' => 'Y-m-d H:i:s' , 'formatter' => 'date' ),
'timestamp' => array ( 'name' => 'timestamp' , 'format' => 'Y-m-d H:i:s' , 'formatter' => 'date' ),
'time' => array ( 'name' => 'time' , 'format' => 'H:i:s' , 'formatter' => 'date' ),
'date' => array ( 'name' => 'date' , 'format' => 'Y-m-d' , 'formatter' => 'date' ),
2006-11-01 06:14:50 +00:00
'binary' => array ( 'name' => 'bytea' ),
'boolean' => array ( 'name' => 'boolean' ),
'number' => array ( 'name' => 'numeric' ),
'inet' => array ( 'name' => 'inet' )
);
2006-05-26 05:29:17 +00:00
var $startQuote = '"' ;
var $endQuote = '"' ;
2007-05-15 19:11:09 +00:00
/**
* Contains mappings of custom auto - increment sequences , if a table uses a sequence name
* other than what is dictated by convention .
*
* @ var array
*/
var $_sequenceMap = array ();
2005-06-12 20:50:12 +00:00
/**
2006-02-18 23:42:21 +00:00
* Connects to the database using options in the given configuration array .
*
* @ return True if successfully connected .
*/
2006-05-26 05:29:17 +00:00
function connect () {
$config = $this -> config ;
$connect = $config [ 'connect' ];
2006-07-13 14:55:48 +00:00
$this -> connection = $connect ( " host=' { $config [ 'host' ] } ' port=' { $config [ 'port' ] } ' dbname=' { $config [ 'database' ] } ' user=' { $config [ 'login' ] } ' password=' { $config [ 'password' ] } ' " );
2008-03-11 02:44:33 +00:00
$this -> connected = false ;
2006-05-26 05:29:17 +00:00
if ( $this -> connection ) {
$this -> connected = true ;
2007-06-23 07:57:18 +00:00
$this -> _execute ( " SET search_path TO " . $config [ 'schema' ]);
2006-05-26 05:29:17 +00:00
}
2007-03-16 14:23:54 +00:00
if ( ! empty ( $config [ 'encoding' ])) {
2006-06-15 14:10:22 +00:00
$this -> setEncoding ( $config [ 'encoding' ]);
}
2006-05-26 05:29:17 +00:00
return $this -> connected ;
}
2005-06-12 20:50:12 +00:00
/**
2006-02-18 23:42:21 +00:00
* Disconnects from database .
*
2007-10-22 16:09:35 +00:00
* @ return boolean True if the database could be disconnected , else false
2006-02-18 23:42:21 +00:00
*/
2006-05-26 05:29:17 +00:00
function disconnect () {
2008-03-11 05:22:17 +00:00
if ( is_resource ( $this -> _result )) {
pg_free_result ( $this -> _result );
2008-03-11 02:44:33 +00:00
}
2008-03-11 05:22:17 +00:00
if ( is_resource ( $this -> connection )) {
2008-03-11 02:44:33 +00:00
$this -> connected = ! pg_close ( $this -> connection );
} else {
$this -> connected = false ;
}
2006-05-26 05:29:17 +00:00
return ! $this -> connected ;
}
2005-09-14 04:11:56 +00:00
/**
2006-02-18 23:42:21 +00:00
* Executes given SQL statement .
*
* @ param string $sql SQL statement
* @ return resource Result resource identifier
*/
2006-05-26 05:29:17 +00:00
function _execute ( $sql ) {
return pg_query ( $this -> connection , $sql );
}
2005-09-14 04:11:56 +00:00
/**
2006-02-18 23:42:21 +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-05-26 05:29:17 +00:00
function listSources () {
2006-07-13 14:55:48 +00:00
$cache = parent :: listSources ();
2006-05-26 05:29:17 +00:00
if ( $cache != null ) {
return $cache ;
}
2007-05-14 00:15:44 +00:00
$schema = $this -> config [ 'schema' ];
$sql = " SELECT table_name as name FROM INFORMATION_SCHEMA.tables WHERE table_schema = ' { $schema } '; " ;
2006-05-26 05:29:17 +00:00
$result = $this -> fetchAll ( $sql );
if ( ! $result ) {
return array ();
} else {
$tables = array ();
2007-06-20 06:15:35 +00:00
foreach ( $result as $item ) {
2006-05-26 05:29:17 +00:00
$tables [] = $item [ 0 ][ 'name' ];
}
parent :: listSources ( $tables );
return $tables ;
}
}
2005-06-12 20:50:12 +00:00
2006-02-18 23:42:21 +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
*/
2006-05-26 05:29:17 +00:00
function & describe ( & $model ) {
2008-01-10 08:44:38 +00:00
$fields = parent :: describe ( $model );
$table = $this -> fullTableName ( $model , false );
$this -> _sequenceMap [ $table ] = array ();
2006-05-26 05:29:17 +00:00
2008-01-10 08:44:38 +00:00
if ( $fields === null ) {
$cols = $this -> fetchAll ( " SELECT DISTINCT column_name AS name, data_type AS type, is_nullable AS null, column_default AS default, ordinal_position AS position, character_maximum_length AS char_length, character_octet_length AS oct_length FROM information_schema.columns WHERE table_name = " . $this -> value ( $table ) . " ORDER BY position " );
2006-05-26 05:29:17 +00:00
2008-01-10 08:44:38 +00:00
foreach ( $cols as $column ) {
$colKey = array_keys ( $column );
2006-05-26 05:29:17 +00:00
2008-01-10 08:44:38 +00:00
if ( isset ( $column [ $colKey [ 0 ]]) && ! isset ( $column [ 0 ])) {
$column [ 0 ] = $column [ $colKey [ 0 ]];
2007-04-01 05:42:31 +00:00
}
2008-01-10 08:44:38 +00:00
if ( isset ( $column [ 0 ])) {
$c = $column [ 0 ];
2008-03-11 05:22:17 +00:00
2008-01-10 08:44:38 +00:00
if ( ! empty ( $c [ 'char_length' ])) {
$length = intval ( $c [ 'char_length' ]);
} elseif ( ! empty ( $c [ 'oct_length' ])) {
$length = intval ( $c [ 'oct_length' ]);
} else {
$length = $this -> length ( $c [ 'type' ]);
}
$fields [ $c [ 'name' ]] = array (
'type' => $this -> column ( $c [ 'type' ]),
'null' => ( $c [ 'null' ] == 'NO' ? false : true ),
2008-01-17 17:09:10 +00:00
'default' => preg_replace ( " /^'(.*)' $ / " , " $ 1 " , preg_replace ( '/::.*/' , '' , $c [ 'default' ])),
2008-01-10 08:44:38 +00:00
'length' => $length
);
2008-01-17 17:09:10 +00:00
if ( $c [ 'name' ] == $model -> primaryKey ) {
$fields [ $c [ 'name' ]][ 'key' ] = 'primary' ;
2008-03-11 05:22:17 +00:00
if ( $fields [ $c [ 'name' ]][ 'type' ] !== 'string' ) {
$fields [ $c [ 'name' ]][ 'length' ] = 11 ;
}
2008-01-17 17:09:10 +00:00
}
if ( $fields [ $c [ 'name' ]][ 'default' ] == 'NULL' || preg_match ( '/nextval\([\'"]?(\w+)/' , $c [ 'default' ], $seq )) {
2008-01-10 08:44:38 +00:00
$fields [ $c [ 'name' ]][ 'default' ] = null ;
2008-01-17 17:09:10 +00:00
if ( ! empty ( $seq ) && isset ( $seq [ 1 ])) {
$this -> _sequenceMap [ $table ][ $c [ 'name' ]] = $seq [ 1 ];
}
2008-01-10 08:44:38 +00:00
}
2006-07-07 19:49:13 +00:00
}
2006-05-26 05:29:17 +00:00
}
2008-01-10 08:44:38 +00:00
$this -> __cacheDescription ( $table , $fields );
}
if ( isset ( $model -> sequence )) {
$this -> _sequenceMap [ $table ][ $model -> primaryKey ] = $model -> sequence ;
2006-05-26 05:29:17 +00:00
}
return $fields ;
}
2006-01-12 02:10:47 +00:00
/**
2006-02-18 23:42:21 +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
* @ param string $column The column into which this data will be inserted
* @ return string Quoted and escaped
* @ todo Add logic that formats / escapes data based on column type
*/
2006-05-26 05:29:17 +00:00
function value ( $data , $column = null ) {
$parent = parent :: value ( $data , $column );
if ( $parent != null ) {
return $parent ;
}
if ( $data === null ) {
return 'NULL' ;
}
switch ( $column ) {
2006-08-01 21:58:13 +00:00
case 'inet' :
2008-03-13 03:06:14 +00:00
case 'float' :
2006-05-26 05:29:17 +00:00
case 'integer' :
2006-07-13 14:55:48 +00:00
if ( $data === '' ) {
2006-05-26 05:29:17 +00:00
return 'DEFAULT' ;
} else {
$data = pg_escape_string ( $data );
}
break ;
case 'binary' :
2006-09-20 05:00:06 +00:00
$data = pg_escape_bytea ( $data );
2006-05-26 05:29:17 +00:00
break ;
case 'boolean' :
2007-07-09 04:03:51 +00:00
default :
2006-09-20 05:00:06 +00:00
if ( $data === true ) {
2007-07-09 04:03:51 +00:00
return 'TRUE' ;
2006-09-20 05:00:06 +00:00
} elseif ( $data === false ) {
2007-07-09 04:03:51 +00:00
return 'FALSE' ;
2006-09-20 05:00:06 +00:00
}
2006-05-26 05:29:17 +00:00
$data = pg_escape_string ( $data );
break ;
}
return " ' " . $data . " ' " ;
}
2005-06-12 20:50:12 +00:00
2006-03-26 09:59:40 +00:00
/**
* Begin a transaction
*
* @ param unknown_type $model
2007-10-22 16:09:35 +00:00
* @ return boolean True on success , false on fail
2006-03-26 09:59:40 +00:00
* ( i . e . if the database / model does not support transactions ) .
*/
2006-05-26 05:29:17 +00:00
function begin ( & $model ) {
2008-03-11 02:44:33 +00:00
if ( parent :: begin ( $model ) && $this -> execute ( 'BEGIN' )) {
$this -> _transactionStarted = true ;
return true ;
2006-05-26 05:29:17 +00:00
}
return false ;
}
2005-09-14 04:11:56 +00:00
/**
2006-02-18 23:42:21 +00:00
* Returns a formatted error message from previous database operation .
*
* @ return string Error message
*/
2006-05-26 05:29:17 +00:00
function lastError () {
2008-03-11 02:44:33 +00:00
$error = pg_last_error ( $this -> connection );
if ( $error ) {
return $error ;
2006-05-26 05:29:17 +00:00
}
return null ;
}
2005-06-12 20:50:12 +00:00
2005-09-14 04:11:56 +00:00
/**
2006-02-18 23:42:21 +00:00
* Returns number of affected rows in previous database operation . If no previous operation exists , this returns false .
*
2007-10-22 16:54:36 +00:00
* @ return integer Number of affected rows
2006-02-18 23:42:21 +00:00
*/
2006-05-26 05:29:17 +00:00
function lastAffected () {
if ( $this -> _result ) {
$return = pg_affected_rows ( $this -> _result );
return $return ;
}
return false ;
}
2005-09-14 04:11:56 +00:00
/**
2006-02-18 23:42:21 +00:00
* Returns number of rows in previous resultset . If no previous resultset exists ,
* this returns false .
*
2007-10-22 16:54:36 +00:00
* @ return integer Number of rows in resultset
2006-02-18 23:42:21 +00:00
*/
2006-05-26 05:29:17 +00:00
function lastNumRows () {
if ( $this -> _result ) {
$return = pg_num_rows ( $this -> _result );
return $return ;
}
return false ;
}
2005-09-14 04:11:56 +00:00
/**
2006-02-18 23:42:21 +00:00
* Returns the ID generated from the previous INSERT operation .
*
* @ param string $source Name of the database table
* @ param string $field Name of the ID database field . Defaults to " id "
2007-10-22 16:54:36 +00:00
* @ return integer
2006-02-18 23:42:21 +00:00
*/
2006-05-26 05:29:17 +00:00
function lastInsertId ( $source , $field = 'id' ) {
2008-01-10 08:44:38 +00:00
$seq = $this -> getSequence ( $source , $field );
$data = $this -> fetchRow ( " SELECT last_value AS max FROM \" { $seq } \" " );
return $data [ 0 ][ 'max' ];
}
/**
* Gets the associated sequence for the given table / field
*
* @ param mixed $table Either a full table name ( with prefix ) as a string , or a model object
* @ param string $field Name of the ID database field . Defaults to " id "
* @ return string The associated sequence name from the sequence map , defaults to " { $table } _ { $field } _seq "
*/
function getSequence ( $table , $field = 'id' ) {
if ( is_object ( $table )) {
$table = $this -> fullTableName ( $table , false );
2007-02-02 00:06:26 +00:00
}
2008-01-10 08:44:38 +00:00
if ( isset ( $this -> _sequenceMap [ $table ]) && isset ( $this -> _sequenceMap [ $table ][ $field ])) {
return $this -> _sequenceMap [ $table ][ $field ];
2007-03-04 04:54:48 +00:00
} else {
2008-01-11 15:49:07 +00:00
return " { $table } _ { $field } _seq " ;
2007-03-04 04:54:48 +00:00
}
2008-01-10 08:44:38 +00:00
}
/**
* Deletes all the records in a table and drops all associated auto - increment sequences
*
* @ param mixed $table A string or model class representing the table to be truncated
* @ param integer $reset If - 1 , sequences are dropped , if 0 ( default ), sequences are reset ,
* and if 1 , sequences are not modified
* @ return boolean SQL TRUNCATE TABLE statement , false if not applicable .
* @ access public
*/
function truncate ( $table , $reset = 0 ) {
if ( parent :: truncate ( $table )) {
$table = $this -> fullTableName ( $table , false );
if ( isset ( $this -> _sequenceMap [ $table ]) && $reset !== 1 ) {
foreach ( $this -> _sequenceMap [ $table ] as $field => $sequence ) {
if ( $reset === 0 ) {
$this -> execute ( " ALTER SEQUENCE \" { $sequence } \" RESTART WITH 1 " );
} elseif ( $reset === - 1 ) {
$this -> execute ( " DROP SEQUENCE IF EXISTS \" { $sequence } \" " );
}
}
}
return true ;
}
return false ;
2006-05-26 05:29:17 +00:00
}
2008-01-09 13:32:45 +00:00
/**
* Prepares field names to be quoted by parent
*
* @ param string $data
* @ return string SQL field
*/
function name ( $data ) {
return parent :: name ( str_replace ( '"__"' , '__' , $data ));
}
2006-04-28 05:26:06 +00:00
/**
* Generates the fields list of an SQL query .
*
* @ param Model $model
* @ param string $alias Alias tablename
* @ param mixed $fields
* @ return array
*/
2007-03-20 17:38:53 +00:00
function fields ( & $model , $alias = null , $fields = array (), $quote = true ) {
if ( empty ( $alias )) {
2007-10-27 01:32:17 +00:00
$alias = $model -> alias ;
2006-05-26 05:29:17 +00:00
}
2007-03-20 17:38:53 +00:00
$fields = parent :: fields ( $model , $alias , $fields , false );
2006-05-26 05:29:17 +00:00
2007-03-20 17:38:53 +00:00
if ( ! $quote ) {
return $fields ;
}
2006-05-26 05:29:17 +00:00
$count = count ( $fields );
if ( $count >= 1 && $fields [ 0 ] != '*' && strpos ( $fields [ 0 ], 'COUNT(*)' ) === false ) {
2007-06-20 06:15:35 +00:00
for ( $i = 0 ; $i < $count ; $i ++ ) {
2007-04-01 05:42:31 +00:00
if ( ! preg_match ( '/^.+\\(.*\\)/' , $fields [ $i ]) && ! preg_match ( '/\s+AS\s+/' , $fields [ $i ])) {
2006-05-26 05:29:17 +00:00
$prepend = '' ;
if ( strpos ( $fields [ $i ], 'DISTINCT' ) !== false ) {
$prepend = 'DISTINCT ' ;
2007-12-08 06:08:03 +00:00
$fields [ $i ] = trim ( str_replace ( 'DISTINCT' , '' , $fields [ $i ]));
2006-05-26 05:29:17 +00:00
}
2008-01-09 13:32:45 +00:00
if ( strrpos ( $fields [ $i ], '.' ) === false ) {
2006-05-26 05:29:17 +00:00
$fields [ $i ] = $prepend . $this -> name ( $alias ) . '.' . $this -> name ( $fields [ $i ]) . ' AS ' . $this -> name ( $alias . '__' . $fields [ $i ]);
} else {
$build = explode ( '.' , $fields [ $i ]);
$fields [ $i ] = $prepend . $this -> name ( $build [ 0 ]) . '.' . $this -> name ( $build [ 1 ]) . ' AS ' . $this -> name ( $build [ 0 ] . '__' . $build [ 1 ]);
}
}
}
}
return $fields ;
}
2005-09-14 04:11:56 +00:00
/**
* Returns a limit statement in the correct format for the particular database .
*
2007-10-22 16:11:12 +00:00
* @ param integer $limit Limit of results returned
* @ param integer $offset Offset from which to start results
2005-09-14 04:11:56 +00:00
* @ return string SQL limit / offset statement
*/
2006-05-26 05:29:17 +00:00
function limit ( $limit , $offset = null ) {
if ( $limit ) {
$rt = '' ;
if ( ! strpos ( strtolower ( $limit ), 'limit' ) || strpos ( strtolower ( $limit ), 'limit' ) === 0 ) {
$rt = ' LIMIT' ;
}
$rt .= ' ' . $limit ;
if ( $offset ) {
$rt .= ' OFFSET ' . $offset ;
}
return $rt ;
}
return null ;
}
2006-03-08 03:13:32 +00:00
/**
* Converts database - layer column types to basic types
*
* @ param string $real Real database - layer column type ( i . e . " varchar(255) " )
* @ return string Abstract column type ( i . e . " string " )
*/
2006-05-26 05:29:17 +00:00
function column ( $real ) {
if ( is_array ( $real )) {
$col = $real [ 'name' ];
if ( isset ( $real [ 'limit' ])) {
$col .= '(' . $real [ 'limit' ] . ')' ;
}
return $col ;
}
2007-12-08 06:08:03 +00:00
$col = str_replace ( ')' , '' , $real );
2006-05-26 05:29:17 +00:00
$limit = null ;
@ list ( $col , $limit ) = explode ( '(' , $col );
if ( in_array ( $col , array ( 'date' , 'time' ))) {
return $col ;
}
if ( strpos ( $col , 'timestamp' ) !== false ) {
return 'datetime' ;
}
2008-01-17 17:09:10 +00:00
if ( strpos ( $col , 'time' ) === 0 ) {
return 'time' ;
}
2006-08-01 21:58:13 +00:00
if ( $col == 'inet' ) {
return ( 'inet' );
}
2006-05-26 05:29:17 +00:00
if ( $col == 'boolean' ) {
return 'boolean' ;
}
if ( strpos ( $col , 'int' ) !== false && $col != 'interval' ) {
return 'integer' ;
}
if ( strpos ( $col , 'char' ) !== false ) {
2007-04-01 05:42:31 +00:00
return 'string' ;
2006-05-26 05:29:17 +00:00
}
if ( strpos ( $col , 'text' ) !== false ) {
2007-04-01 05:42:31 +00:00
return 'text' ;
2006-05-26 05:29:17 +00:00
}
if ( strpos ( $col , 'bytea' ) !== false ) {
2007-04-01 05:42:31 +00:00
return 'binary' ;
2006-05-26 05:29:17 +00:00
}
2006-08-01 02:32:30 +00:00
if ( in_array ( $col , array ( 'float' , 'float4' , 'float8' , 'double' , 'double precision' , 'decimal' , 'real' , 'numeric' ))) {
2006-05-26 05:29:17 +00:00
return 'float' ;
}
return 'text' ;
}
2007-04-01 05:42:31 +00:00
/**
* Gets the length of a database - native column description , or null if no length
*
* @ param string $real Real database - layer column type ( i . e . " varchar(255) " )
* @ return int An integer representing the length of the column
*/
function length ( $real ) {
2007-12-08 06:08:03 +00:00
$col = str_replace ( array ( ')' , 'unsigned' ), '' , $real );
2007-04-01 05:42:31 +00:00
$limit = null ;
if ( strpos ( $col , '(' ) !== false ) {
list ( $col , $limit ) = explode ( '(' , $col );
}
2006-03-08 03:13:32 +00:00
2007-04-01 05:42:31 +00:00
if ( $limit != null ) {
return intval ( $limit );
}
return null ;
}
2006-03-08 03:13:32 +00:00
/**
* Enter description here ...
*
* @ param unknown_type $results
*/
2006-05-26 05:29:17 +00:00
function resultSet ( & $results ) {
$this -> results =& $results ;
$this -> map = array ();
$num_fields = pg_num_fields ( $results );
$index = 0 ;
$j = 0 ;
2007-06-20 06:15:35 +00:00
while ( $j < $num_fields ) {
2006-05-26 05:29:17 +00:00
$columnName = pg_field_name ( $results , $j );
if ( strpos ( $columnName , '__' )) {
$parts = explode ( '__' , $columnName );
2006-11-03 04:10:40 +00:00
$this -> map [ $index ++ ] = array ( $parts [ 0 ], $parts [ 1 ]);
2006-05-26 05:29:17 +00:00
} else {
$this -> map [ $index ++ ] = array ( 0 , $columnName );
}
$j ++ ;
}
}
2006-02-18 23:42:21 +00:00
/**
* Fetches the next row from the current result set
*
* @ return unknown
*/
2006-05-26 05:29:17 +00:00
function fetchResult () {
if ( $row = pg_fetch_row ( $this -> results )) {
$resultRow = array ();
$i = 0 ;
2007-06-20 06:15:35 +00:00
foreach ( $row as $index => $field ) {
2006-05-26 05:29:17 +00:00
list ( $table , $column ) = $this -> map [ $index ];
$resultRow [ $table ][ $column ] = $row [ $index ];
$i ++ ;
}
return $resultRow ;
} else {
return false ;
}
}
2006-03-28 02:44:55 +00:00
/**
2006-07-11 14:34:35 +00:00
* Translates between PHP boolean values and PostgreSQL boolean values
2006-03-28 02:44:55 +00:00
*
* @ param mixed $data Value to be translated
2007-10-22 16:54:36 +00:00
* @ param boolean $quote True to quote value , false otherwise
2006-03-28 02:44:55 +00:00
* @ return mixed Converted boolean value
*/
2007-04-29 07:02:25 +00:00
function boolean ( $data , $quote = true ) {
2008-03-11 05:22:17 +00:00
switch ( true ) {
case ( $data === true || $data === false ) :
return $data ;
case ( $data === 't' || $data === 'f' ) :
return ( $data === 't' );
default :
return ( bool ) $data ;
break ;
2007-04-29 07:02:25 +00:00
}
2006-05-26 05:29:17 +00:00
}
2006-06-15 14:10:22 +00:00
/**
* Sets the database encoding
*
* @ param mixed $enc Database encoding
2007-10-22 16:09:35 +00:00
* @ return boolean True on success , false on failure
2006-06-15 14:10:22 +00:00
*/
function setEncoding ( $enc ) {
return pg_set_client_encoding ( $this -> connection , $enc ) == 0 ;
}
/**
* Gets the database encoding
*
* @ return string The database encoding
*/
function getEncoding () {
return pg_client_encoding ( $this -> connection );
}
2008-01-09 13:32:45 +00:00
/**
* Generate a Postgres - native column schema string
*
* @ param array $column An array structured like the following : array ( 'name' => 'value' , 'type' => 'value' [, options ]),
* where options can be 'default' , 'length' , or 'key' .
* @ return string
*/
function buildColumn ( $column ) {
2008-01-10 08:44:38 +00:00
$out = str_replace ( 'integer serial' , 'serial' , parent :: buildColumn ( $column ));
return preg_replace ( '/integer\([0-9]+\)/' , 'integer' , $out );
2008-01-09 13:32:45 +00:00
}
/**
* Format indexes for create table
*
* @ param array $indexes
* @ return string
*/
function buildIndex ( $indexes ) {
$join = array ();
foreach ( $indexes as $name => $value ) {
$out = '' ;
if ( $name == 'PRIMARY' ) {
$out .= 'PRIMARY ' ;
$name = null ;
} else {
if ( ! empty ( $value [ 'unique' ])) {
$name .= ' UNIQUE ' ;
}
}
if ( is_array ( $value [ 'column' ])) {
$out .= 'CONSTRAINT ' . $name . ' (' . join ( ', ' , array_map ( array ( & $this , 'name' ), $value [ 'column' ])) . ')' ;
} else {
$out .= 'KEY ' . $name . ' (' . $this -> name ( $value [ 'column' ]) . ')' ;
}
$join [] = $out ;
}
return join ( " , \n \t " , $join );
}
2006-07-07 19:49:13 +00:00
}
2008-01-01 23:57:17 +00:00
2007-05-03 04:35:25 +00:00
?>