cox             Mon Mar 26 15:31:50 2001 EDT

  Modified files:              
    /php4/pear  DB.php 
    /php4/pear/DB       pgsql.php 
  Log:
  pgsql.php
  * connect() always use pg_connect string instead of the deprecated params
  mode
  * removed duplicated functions prepare() and execute() (now in common.php)
  * pgsqlRaiseError() always fills native error param on DB_error objs
  * added third param $rownum to fetchInto() so users can fetch also absolute
  row numbers
  * changed fetchRow() to use fetchInto() (can not erase, still used in get*()
  from common.php
  
  DB.php
  * added third param $rownum to fetchInto()/fetchRow() so users can fetch
  also absolute row numbers
  * changed fetchRow() to use fetchInto()
  
  
Index: php4/pear/DB.php
diff -u php4/pear/DB.php:1.53 php4/pear/DB.php:1.54
--- php4/pear/DB.php:1.53       Fri Mar 23 23:00:44 2001
+++ php4/pear/DB.php    Mon Mar 26 15:31:49 2001
@@ -17,7 +17,7 @@
 // |          Tomas V.V.Cox <[EMAIL PROTECTED]>                             |
 // +----------------------------------------------------------------------+
 //
-// $Id: DB.php,v 1.53 2001/03/24 07:00:44 ssb Exp $
+// $Id: DB.php,v 1.54 2001/03/26 23:31:49 cox Exp $
 //
 // Database independent query interface.
 //
@@ -135,7 +135,7 @@
 /**
  * these are constants for the tableInfo-function
  * they are bitwised or'ed. so if there are more constants to be defined
- * in the future, adjust DB_TABLEINFO_FULL accordingly 
+ * in the future, adjust DB_TABLEINFO_FULL accordingly
  */
 
 define('DB_TABLEINFO_ORDER', 1);
@@ -579,29 +579,36 @@
     }
 
     /**
-     * Fetch and return a row of data.
+     * Fetch and return a row of data (it uses fetchInto for that)
+     * @param   $fetchmode  format of fetched row array
+     * @param   $rownum     the absolute row number to fetch
+     *
      * @return  array   a row of data, or false on error
      */
-    function fetchRow($fetchmode = DB_FETCHMODE_DEFAULT)
+    function fetchRow($fetchmode = DB_FETCHMODE_DEFAULT, $rownum=0)
     {
-        if ($fetchmode == DB_FETCHMODE_DEFAULT) {
-            $fetchmode = $this->dbh->fetchmode;
+        $res = $this->fetchInto ($arr, $fetchmode, $rownum);
+        if ($res !== DB_OK) {
+            return $res;
         }
-        return $this->dbh->fetchRow($this->result, $fetchmode);
+        return $arr;
     }
 
     /**
      * Fetch a row of data into an existing array.
+     *
+     * @param   $arr                reference to data array
+     * @param   $fetchmode  format of fetched row array
+     * @param   $rownum     the absolute row number to fetch
      *
-     * @param   $arr    reference to data array
      * @return  int     error code
      */
-    function fetchInto(&$arr, $fetchmode = DB_FETCHMODE_DEFAULT)
+    function fetchInto(&$arr, $fetchmode = DB_FETCHMODE_DEFAULT, $rownum=0)
     {
         if ($fetchmode == DB_FETCHMODE_DEFAULT) {
             $fetchmode = $this->dbh->fetchmode;
         }
-        return $this->dbh->fetchInto($this->result, $arr, $fetchmode);
+        return $this->dbh->fetchInto($this->result, $arr, $fetchmode, $rownum=0);
     }
 
     /**
Index: php4/pear/DB/pgsql.php
diff -u php4/pear/DB/pgsql.php:1.31 php4/pear/DB/pgsql.php:1.32
--- php4/pear/DB/pgsql.php:1.31 Fri Mar  9 22:04:14 2001
+++ php4/pear/DB/pgsql.php      Mon Mar 26 15:31:50 2001
@@ -39,11 +39,12 @@
     var $prepare_tokens = array();
     var $prepare_types = array();
     var $transaction_opcount = 0;
-    var $numrows;
-    var $row;
-    var $affected;
+    var $dsn = array();
+    var $row = array();
+    var $numrows = array();
+    var $affected = 0;
     var $autocommit = true;
-    var $dsn;
+    var $fetchmode = DB_FETCHMODE_ORDERED;
 
     // }}}
     // {{{ constructor
@@ -60,9 +61,6 @@
         );
         $this->errorcode_map = array(
         );
-        $this->numrows = array();
-        $this->row = array();
-        $this->affected = 0;
     }
 
     // }}}
@@ -77,53 +75,32 @@
      *
      * @return int DB_OK on success, a DB error code on failure
      */
-    function connect($dsn, $persistent = false)
+    function connect($dsninfo, $persistent = false)
     {
-        if (is_array($dsn)) {
-            $dsninfo = &$dsn;
-        } else {
-            $dsninfo = DB::parseDSN($dsn);
-        }
-        if (!$dsninfo || !$dsninfo['phptype']) {
-            return $this->raiseError(); // XXX ERRORMSG
-        }
         $this->dsn = $dsninfo;
-        $dbhost = $dsninfo['hostspec'] ? $dsninfo['hostspec'] : 'unix';
-        if ($dbhost == 'unix') {
-            $protocol = 'unix';
-        } else {
-            $protocol = $dsninfo['protocol'] ? $dsninfo['protocol'] : 'tcp';
+        $host = $dsninfo['hostspec'];
+        $connstr = '';
+        if (($host !== false) && ($dsninfo['protocol'] != 'unix')){
+            if (($pos=strpos(':', $host)) !== false) {
+                $dbhost = substr($host, 0, $pos);
+                $port = substr($host, $pos+1);
+            } else {
+                $dbhost = $host;
+                $port = '5432';
+            }
+            $connstr="host=".$dsninfo['hostspec']." port=".$port;
         }
-        $user = $dsninfo['username'];
-        $pw = $dsninfo['password'];
-        $dbname = $dsninfo['database'];
-        $options = (!empty($dsninfo['options'])) ? $dsninfo['options'] : NULL;
-        $tty = (!empty($dsninfo['tty'])) ? $dsninfo['tty'] : NULL;
-        $port = (!empty($dsninfo['port'])) ? $dsninfo['port'] : '5432';
+        $connstr .= $dsninfo['database'] ? " dbname=".$dsninfo['database'] : NULL;
+        $connstr .= $dsninfo['username'] ? " user=".$dsninfo['username'] : NULL;
+        $connstr .= $dsninfo['password'] ? " password=".$dsninfo['password'] : NULL;
+        $connstr .= (!empty($dsninfo['options'])) ? " options=".$dsninfo['options'] : 
+NULL;
+        $connstr .= (!empty($dsninfo['tty'])) ? " tty=".$dsninfo['tty'] : NULL;
 
         $connect_function = $persistent ? 'pg_pconnect' : 'pg_connect';
 
-        if (($protocol == 'unix') && $dbname) {
-            $connect_params = "dbname=$dbname";
-            if ($user) {
-                $connect_params .= " user=$user";
-            }
-            if ($pw) {
-                $connect_params .= " password=$pw";
-            }
-            $conn = @$connect_function($connect_params);
-        } elseif ($dbhost && $user && $pw && $dbname) {
-            $conn = @$connect_function(
-                "host=$dbhost port=$port dbname=$dbname user=$user password=$pw");
-        } elseif ($dbhost && $dbname && $options && $tty) {
-            $conn = @$connect_function($dbhost, $port, $options, $tty, $dbname);
-        } elseif ($dbhost && $dbname) {
-            $conn = @$connect_function($dbhost, $port, $dbname);
-        } else {
-            $conn = false;
-        }
+        $conn = @$connect_function($connstr);
         if ($conn == false) {
-            return $this->raiseError(); // XXX ERRORMSG
+            return $this->raiseError(DB_ERROR_CONNECT_FAILED);
         }
         $this->connection = $conn;
         return DB_OK;
@@ -188,7 +165,11 @@
                UNLISTEN, UPDATE, VACUUM
             */
             $this->row[$result] = 0; // reset the row counter.
-            $this->numrows[$result] = @pg_numrows($result);  
+            $numrows = $this->numrows($result);
+            if (is_object($numrows)) {
+                return $numrows;
+            }
+            $this->numrows[$result] = $numrows;
             $this->affected = 0;
             return $result;
         } else {
@@ -230,85 +211,61 @@
                 return $code;
             }
         }
-        //php_error(E_WARNING, get_class($this)."::errorCode: no mapping for 
$nativecode");
         // Fall back to DB_ERROR if there was no mapping.
         return DB_ERROR;
-        //return $errormsg;
     }
 
     // }}}
-    // {{{ fetchRow()
-
     /**
-     * Fetch a row and return as array.
-     *
+     * Fetch and return a row of data (it uses fetchInto for that)
      * @param $result PostgreSQL result identifier
-     * @param $fetchmode how the resulting array should be indexed
-     *
-     * @return int an array on success, a DB error code on failure, NULL
-     *             if there is no more data
+    * @param   $fetchmode  format of fetched row array
+     * @param   $rownum     the absolute row number to fetch
+    *
+    * @return  array   a row of data, or false on error
      */
-    function &fetchRow($result, $fetchmode = DB_FETCHMODE_DEFAULT)
+    function fetchRow($result, $fetchmode = DB_FETCHMODE_DEFAULT, $rownum=0)
     {
         if ($fetchmode == DB_FETCHMODE_DEFAULT) {
             $fetchmode = $this->fetchmode;
         }
-        if ($this->row[$result] >= $this->numrows[$result]) {
-            return NULL;
+        $res = $this->fetchInto ($result, $arr, $fetchmode, $rownum);
+        if ($res !== DB_OK) {
+            return $res;
         }
-        if ($fetchmode & DB_FETCHMODE_ASSOC) {
-            $row = @pg_fetch_array($result, $this->row[$result], PGSQL_ASSOC);
-        } else {
-            $row = @pg_fetch_row($result, $this->row[$result]);
-        }
-        if (!$row) {
-            $err = $this->pgsqlRaiseError();
-            if (!$err) {
-                return NULL;
-            }
-            return $err;
-        }
-        $this->row[$result]++;
-        return $row;
+        return $arr;
     }
 
-    // }}}
     // {{{ fetchInto()
 
     /**
      * Fetch a row and insert the data into an existing array.
      *
      * @param $result PostgreSQL result identifier
-     * @param $arr (reference) array where data from the row is stored
+     * @param $row (reference) array where data from the row is stored
      * @param $fetchmode how the array data should be indexed
+     * @param $rownum the row number to fetch
      *
      * @return int DB_OK on success, a DB error code on failure
      */
-    function fetchInto($result, &$arr, $fetchmode = DB_FETCHMODE_DEFAULT)
+    function fetchInto($result, &$row, $fetchmode, $rownum=0)
     {
-        if ($fetchmode == DB_FETCHMODE_DEFAULT) {
-            $fetchmode = $this->fetchmode;
-        }
-        if ($this->row[$result]>=$this->numrows[$result]){
+        $rownum = ($rownum > 0) ? $rownum : $this->row[$result];
+        if ($rownum >= $this->numrows[$result]) {
             return NULL;
         }
         if ($fetchmode & DB_FETCHMODE_ASSOC) {
-            $arr = @pg_fetch_array($result, $this->row[$result], PGSQL_ASSOC);
+            $row = @pg_fetch_array($result, $rownum, PGSQL_ASSOC);
         } else {
-            $arr = @pg_fetch_row($result, $this->row[$result]);
+            $row = @pg_fetch_row($result, $rownum);
         }
-        if (!$arr) {
-            /* 
-             $errno = pg_errormessage($this->connection);
-             if (!$errno) {
-                return NULL;
-             }
-             return $errno;
-            */
-            // the error codes are not supported in pgsql. 
-            return $this->raiseError(DB_ERROR_NOT_CAPABLE); // XXX ERRORMSG
+        if (!$row) {
+            $err = $this->pgsqlRaiseError();
+            if ($err) {
+                return $err;
+            }
         }
-        $this->row[$result]++;
+        $this->row[$result] = ++$rownum;
         return DB_OK;
     }
 
@@ -335,7 +292,7 @@
         unset($this->row[$result]);
         unset($this->numrows[$result]);
         $this->affected = 0;
-        return true; 
+        return true;
     }
 
     // }}}
@@ -391,54 +348,6 @@
     }
 
     // }}}
-    // {{{ prepare()
-
-    /**
-     * Prepares a query for multiple execution with execute().  With
-     * PostgreSQL, this is emulated.
-     */
-    function prepare($query)
-    {
-        $tokens = split('[\&\?]', $query);
-        $token = 0;
-        $types = array();
-        for ($i = 0; $i < strlen($query); $i++) {
-            switch ($query[$i]) {
-                case '?':
-                    $types[$token++] = DB_PARAM_SCALAR;
-                    break;
-                case '&':
-                    $types[$token++] = DB_PARAM_OPAQUE;
-                    break;
-            }
-        }
-        $this->prepare_tokens[] = &$tokens;
-        end($this->prepare_tokens);
-        $k = key($this->prepare_tokens);
-        $this->prepare_types[$k] = $types;
-        return $k;
-    }
-
-    // }}}
-    // {{{ execute()
-
-    /**
-     * @return mixed returns a DB result object for successful SELECT
-     *         queries, DB_OK for other successful queries.  A DB
-     *         error is returned on failure.
-     */
-    function execute($stmt, $data = false)
-    {
-        $realquery = $this->executeEmulateQuery($stmt, $data);
-        $result = $this->simpleQuery($realquery);
-        if (DB::isError($result) || $result === DB_OK) {
-            return $result;
-        } else {
-            return new DB_result($this, $result);
-        }
-    }
-
-    // }}}
     // {{{ autoCommit()
 
     /**
@@ -501,17 +410,13 @@
      */
     function affectedRows()
     {
-        $result = $this->affected;
-        if ($result === false) {
-            return $this->raiseError();
-        }
-        return $result;
-     }
+        return $this->affected;
+    }
      // }}}
     // {{{ nextId()
 
     /**
-     * Get the next value in a sequence.  
+     * Get the next value in a sequence.
      *
      * We are using native PostgreSQL sequences. If a sequence does
      * not exist, it will be created, unless $ondemand is false.
@@ -583,10 +488,13 @@
 
     function pgsqlRaiseError($errno = null)
     {
+        $native = $this->errorNative();
         if ($errno === null) {
-            return 
$this->raiseError($this->errorCode(pg_errormessage($this->connection)));
+            $err = $this->errorCode($native);
+        } else {
+            $err = $errno;
         }
-        return $this->raiseError($this->errorCode($errno));
+        return $this->raiseError($err, null, null, null, $native);
     }
 
     // }}}

-- 
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]
To contact the list administrators, e-mail: [EMAIL PROTECTED]

Reply via email to