<?php if (!defined('BASEPATH')) exit('No direct script access allowed'); /** * Code Igniter * * An open source application development framework for PHP 4.3.2 or newer * * @package CodeIgniter * @author Rick Ellis * @copyright Copyright (c) 2006, pMachine, Inc. * @license http://www.codeignitor.com/user_guide/license.html * @link http://www.codeigniter.com * @since Version 1.0 * @filesource */ // ------------------------------------------------------------------------ /** * Postgre Database Adapter Class * * Note: _DB is an extender class that the app controller * creates dynamically based on whether the active record * class is being used or not. * * @package CodeIgniter * @subpackage Drivers * @category Database * @author Rick Ellis * @link http://www.codeigniter.com/user_guide/libraries/database/ */ class CI_DB_postgre extends CI_DB { /** * Non-persistent database connection * * @access private called by the base class * @return resource */ function db_connect() { $port = ($this->port == '') ? '' : " port=".$this->port; return pg_connect("host=".$this->hostname.$port." dbname=".$this->database." user=".$this->username." password=".$this->password); } // -------------------------------------------------------------------- /** * Persistent database connection * * @access private called by the base class * @return resource */ function db_pconnect() { $port = ($this->port == '') ? '' : " port=".$this->port; return pg_pconnect("host=".$this->hostname.$port." dbname=".$this->database." user=".$this->username." password=".$this->password); } // -------------------------------------------------------------------- /** * Select the database * * @access private called by the base class * @return resource */ function db_select() { // Not needed for Postgre so we'll return TRUE return TRUE; } // -------------------------------------------------------------------- /** * Execute the query * * @access private called by the base class * @param string an SQL query * @return resource */ function execute($sql) { $sql = $this->_prep_query($sql); return @pg_query($this->conn_id, $sql); } // -------------------------------------------------------------------- /** * Prep the query * * If needed, each database adapter can prep the query string * * @access private called by execute() * @param string an SQL query * @return string */ function _prep_query($sql) { return $sql; } // -------------------------------------------------------------------- /** * Escape String * * @access public * @param string * @return string */ function escape_str($str) { return pg_escape_string($str); } // -------------------------------------------------------------------- /** * Close DB Connection * * @access public * @param resource * @return void */ function destroy($conn_id) { pg_close($conn_id); } // -------------------------------------------------------------------- /** * Affected Rows * * @access public * @return integer */ function affected_rows() { return @pg_affected_rows($this->result_id); } // -------------------------------------------------------------------- /** * Insert ID * * @access public * @return integer */ function insert_id() { $v = pg_version($this->conn_id); $v = $v['server']; $table = func_num_args() > 0 ? func_get_arg(0) : null; $column = func_num_args() > 1 ? func_get_arg(1) : null; if ($table == null && $v >= '8.1') { $sql='SELECT LASTVAL() as ins_id'; } elseif ($table != null && $column != null && $v >= '8.0') { $sql = sprintf("SELECT pg_get_serial_sequence('%s','%s') as seq", $table, $column); $query = $this->query($sql); $row = $query->row(); $sql = sprintf("SELECT CURRVAL('%s') as ins_id", $row->seq); } elseif ($table != null) { // seq_name passed in table parameter $sql = sprintf("SELECT CURRVAL('%s') as ins_id", $table); } else { return pg_last_oid($this->result_id); } $query = $this->query($sql); $row = $query->row(); return $row->ins_id; } // -------------------------------------------------------------------- /** * "Count All" query * * Generates a platform-specific query string that counts all records in * the specified database * * @access public * @param string * @return string */ function count_all($table = '') { if ($table == '') return '0'; $query = $this->query('SELECT COUNT(*) AS numrows FROM "'.$this->dbprefix.$table.'"'); if ($query->num_rows() == 0) return '0'; $row = $query->row(); return $row->numrows; } // -------------------------------------------------------------------- /** * The error message string * * @access public * @return string */ function error_message() { return pg_last_error($this->conn_id); } // -------------------------------------------------------------------- /** * The error message number * * @access public * @return integer */ function error_number() { return ''; } // -------------------------------------------------------------------- /** * Escape Table Name * * This function adds backticks if the table name has a period * in it. Some DBs will get cranky unless periods are escaped. * * @access public * @param string the table name * @return string */ function escape_table($table) { if (stristr($table, '.')) { $table = '"'.preg_replace("/\./", '"."', $table).'"'; } return $table; } // -------------------------------------------------------------------- /** * Field data query * * Generates a platform-specific query so that the column data can be retrieved * * @access public * @param string the table name * @return object */ function _field_data($table) { $sql = "SELECT * FROM ".$this->escape_table($table)." LIMIT 1"; $query = $this->query($sql); return $query->field_data(); } // -------------------------------------------------------------------- /** * Insert statement * * Generates a platform-specific insert string from the supplied data * * @access public * @param string the table name * @param array the insert keys * @param array the insert values * @return string */ function _insert($table, $keys, $values) { return "INSERT INTO ".$this->escape_table($table)." (".implode(', ', $keys).") VALUES (".implode(', ', $values).")"; } // -------------------------------------------------------------------- /** * Update statement * * Generates a platform-specific update string from the supplied data * * @access public * @param string the table name * @param array the update data * @param array the where clause * @return string */ function _update($table, $values, $where) { foreach($values as $key => $val) { $valstr[] = $key." = ".$val; } return "UPDATE ".$this->escape_table($table)." SET ".implode(', ', $valstr)." WHERE ".implode(" ", $where); } // -------------------------------------------------------------------- /** * Delete statement * * Generates a platform-specific delete string from the supplied data * * @access public * @param string the table name * @param array the where clause * @return string */ function _delete($table, $where) { return "DELETE FROM ".$this->escape_table($table)." WHERE ".implode(" ", $where); } // -------------------------------------------------------------------- /** * Version number query string * * @access public * @return string */ function _version() { return "SELECT version() AS ver"; } /** * Show table query * * Generates a platform-specific query string so that the table names can be fetched * * @access public * @return string */ function _show_tables() { return "SELECT table_name FROM information_schema.tables WHERE table_schema = 'public'"; } // -------------------------------------------------------------------- /** * Show columnn query * * Generates a platform-specific query string so that the column names can be fetched * * @access public * @param string the table name * @return string */ function _show_columns($table = '') { return "SELECT column_name FROM information_schema.columns WHERE table_name ='".$this->escape_table($table)."'"; } // -------------------------------------------------------------------- /** * Limit string * * Generates a platform-specific LIMIT clause * * @access public * @param string the sql query string * @param integer the number of rows to limit the query to * @param integer the offset value * @return string */ function _limit($sql, $limit, $offset) { $sql .= "LIMIT ".$limit; if ($offset > 0) { $sql .= " OFFSET ".$offset; } return $sql; } } /** * Postgres Result Class * * This class extends the parent result class: CI_DB_result * * @category Database * @author Rick Ellis * @link http://www.codeigniter.com/user_guide/libraries/database/ */ class CI_DB_postgre_result extends CI_DB_result { /** * Number of rows in the result set * * @access public * @return integer */ function num_rows() { return @pg_num_rows($this->result_id); } // -------------------------------------------------------------------- /** * Number of fields in the result set * * @access public * @return integer */ function num_fields() { return @pg_num_fields($this->result_id); } // -------------------------------------------------------------------- /** * Field data * * Generates an array of objects containing field meta-data * * @access public * @return array */ function field_data() { $retval = array(); for ($i = 0; $i < $this->num_fields(); $i++) { $F = new stdClass(); $F->name = pg_field_name($this->result_id, $i); $F->type = pg_field_type($this->result_id, $i); $F->max_length = pg_field_size($this->result_id, $i); $F->primary_key = $i == 0; $F->default = ''; $retval[] = $F; } return $retval; } // -------------------------------------------------------------------- /** * Result - associative array * * Returns the result set as an array * * @access private * @return array */ function _fetch_assoc() { return pg_fetch_assoc($this->result_id); } // -------------------------------------------------------------------- /** * Result - object * * Returns the result set as an object * * @access private * @return object */ function _fetch_object() { return pg_fetch_object($this->result_id); } } ?>