ssb             Mon Feb 19 04:22:31 2001 EDT

  Added files:                 
    /php4/pear/DB/tests transactions.inc 
    /php4/pear/DB/tests/pgsql   011.phpt 

  Modified files:              
    /php4/pear/DB       common.php ibase.php msql.php mssql.php mysql.php 
                        oci8.php odbc.php pgsql.php sybase.php 
  Log:
  @Fixed pgsql transaction support (Stig, PEAR/DB)
  also added "dsn" property in all backends
  
  
  
Index: php4/pear/DB/common.php
diff -u php4/pear/DB/common.php:1.37 php4/pear/DB/common.php:1.38
--- php4/pear/DB/common.php:1.37        Sun Feb 18 08:23:03 2001
+++ php4/pear/DB/common.php     Mon Feb 19 04:22:25 2001
@@ -44,6 +44,7 @@
         'persistent' => false,       // persistent connection?
         'optimize' => 'performance', // 'performance' or 'portability'
     );
+    var $dbh;
 
     // }}}
     // {{{ toString()
Index: php4/pear/DB/ibase.php
diff -u php4/pear/DB/ibase.php:1.16 php4/pear/DB/ibase.php:1.17
--- php4/pear/DB/ibase.php:1.16 Fri Feb 16 09:14:39 2001
+++ php4/pear/DB/ibase.php      Mon Feb 19 04:22:26 2001
@@ -16,7 +16,7 @@
 // | Authors: Sterling Hughes <[EMAIL PROTECTED]>                          |
 // +----------------------------------------------------------------------+
 //
-// $Id: ibase.php,v 1.16 2001/02/16 17:14:39 chagenbu Exp $
+// $Id: ibase.php,v 1.17 2001/02/19 12:22:26 ssb Exp $
 //
 // Database independent query interface definition for PHP's Interbase
 // extension.
@@ -53,6 +53,7 @@
                if (!$dsninfo || !$dsninfo['phptype']) {
                        return $this->raiseError("invalid data source name"); 
                }
+        $this->dsn = $dsninfo;
                $user = $dsninfo['username'];
                $pw = $dsninfo['password'];
                $dbhost = $dsninfo['hostspec'] ? 
Index: php4/pear/DB/msql.php
diff -u php4/pear/DB/msql.php:1.15 php4/pear/DB/msql.php:1.16
--- php4/pear/DB/msql.php:1.15  Fri Feb 16 09:14:39 2001
+++ php4/pear/DB/msql.php       Mon Feb 19 04:22:26 2001
@@ -16,7 +16,7 @@
 // | Authors: Sterling Hughes <[EMAIL PROTECTED]>                          |
 // +----------------------------------------------------------------------+
 //
-// $Id: msql.php,v 1.15 2001/02/16 17:14:39 chagenbu Exp $
+// $Id: msql.php,v 1.16 2001/02/19 12:22:26 ssb Exp $
 //
 // Database independent query interface definition for PHP's Mini-SQL
 // extension.
@@ -53,7 +53,7 @@
         if (!$dsninfo || !$dsninfo['phptype']) {
             return $this->raiseError(); 
         }
-
+        $this->dsn = $dsninfo;
         $user = $dsninfo['username'];
         $pw = $dsninfo['password'];
         $dbhost = $dsninfo['hostspec'] ? $dsninfo['hostspec'] : 'localhost';
Index: php4/pear/DB/mssql.php
diff -u php4/pear/DB/mssql.php:1.18 php4/pear/DB/mssql.php:1.19
--- php4/pear/DB/mssql.php:1.18 Fri Feb 16 09:14:39 2001
+++ php4/pear/DB/mssql.php      Mon Feb 19 04:22:26 2001
@@ -16,7 +16,7 @@
 // | Authors: Sterling Hughes <[EMAIL PROTECTED]>                          |
 // +----------------------------------------------------------------------+
 //
-// $Id: mssql.php,v 1.18 2001/02/16 17:14:39 chagenbu Exp $
+// $Id: mssql.php,v 1.19 2001/02/19 12:22:26 ssb Exp $
 //
 // Database independent query interface definition for PHP's Microsoft SQL Server
 // extension.
@@ -53,7 +53,7 @@
         if (!$dsninfo || !$dsninfo['phptype']) {
             return $this->raiseError(mssql_get_last_message()); 
         }
-
+        $this->dsn = $dsninfo;
         $user = $dsninfo['username'];
         $pw = $dsninfo['password'];
         $dbhost = $dsninfo['hostspec'] ? $dsninfo['hostspec'] : 'localhost';
Index: php4/pear/DB/mysql.php
diff -u php4/pear/DB/mysql.php:1.48 php4/pear/DB/mysql.php:1.49
--- php4/pear/DB/mysql.php:1.48 Sat Feb 17 08:45:01 2001
+++ php4/pear/DB/mysql.php      Mon Feb 19 04:22:26 2001
@@ -102,6 +102,8 @@
             return $this->raiseError(); // XXX ERRORMSG
         }
        
+        $this->dsn = $dsninfo;
+
         $dbhost = $dsninfo["hostspec"] ? $dsninfo["hostspec"] : "localhost";
         $user = $dsninfo["username"];
         $pw = $dsninfo["password"];
Index: php4/pear/DB/oci8.php
diff -u php4/pear/DB/oci8.php:1.18 php4/pear/DB/oci8.php:1.19
--- php4/pear/DB/oci8.php:1.18  Sun Feb 18 08:24:00 2001
+++ php4/pear/DB/oci8.php       Mon Feb 19 04:22:26 2001
@@ -79,6 +79,7 @@
                if (!$dsninfo || !$dsninfo['phptype']) {
                        return $this->raiseError();
                }
+        $this->dsn = $dsninfo;
                $user = $dsninfo['username'];
                $pw = $dsninfo['password'];
                $hostspec = $dsninfo['hostspec'];
Index: php4/pear/DB/odbc.php
diff -u php4/pear/DB/odbc.php:1.27 php4/pear/DB/odbc.php:1.28
--- php4/pear/DB/odbc.php:1.27  Sun Feb 18 16:14:27 2001
+++ php4/pear/DB/odbc.php       Mon Feb 19 04:22:26 2001
@@ -97,6 +97,7 @@
                if (!$dsninfo || !$dsninfo['phptype']) {
                        return $this->raiseError(); // XXX ERRORMSG
                }
+        $this->dsn = $dsninfo;
                $this->dbsyntax = $dsninfo['dbsyntax'];
                switch ($this->dbsyntax) {
                        case 'solid':
Index: php4/pear/DB/pgsql.php
diff -u php4/pear/DB/pgsql.php:1.29 php4/pear/DB/pgsql.php:1.30
--- php4/pear/DB/pgsql.php:1.29 Sun Feb 18 16:14:27 2001
+++ php4/pear/DB/pgsql.php      Mon Feb 19 04:22:26 2001
@@ -14,7 +14,7 @@
 // | [EMAIL PROTECTED] so we can mail you a copy immediately.               |
 // +----------------------------------------------------------------------+
 // | Authors: Rui Hirokawa <[EMAIL PROTECTED]>                     |
-// |                                                                      |
+// |          Stig Bakken <[EMAIL PROTECTED]>                                   |
 // +----------------------------------------------------------------------+
 //
 // Database independent query interface definition for PHP's PostgreSQL
@@ -38,10 +38,12 @@
     var $phptype, $dbsyntax;
     var $prepare_tokens = array();
     var $prepare_types = array();
+    var $transaction_opcount = 0;
     var $numrows;
     var $row;
     var $affected;
-    var $autocommit = 1;
+    var $autocommit = true;
+    var $dsn;
 
     // }}}
     // {{{ constructor
@@ -85,6 +87,7 @@
         if (!$dsninfo || !$dsninfo['phptype']) {
             return $this->raiseError(); // XXX ERRORMSG
         }
+        $this->dsn = $dsninfo;
         $dbhost = $dsninfo['hostspec'] ? $dsninfo['hostspec'] : 'unix';
         if ($dbhost == 'unix') {
             $protocol = 'unix';
@@ -154,18 +157,25 @@
      */
     function simpleQuery($query)
     {
+        $ismanip = DB::isManip($query);
         $this->last_query = $query;
         $query = $this->modifyQuery($query);
+        if (!$this->autocommit && $ismanip) {
+            if ($this->transaction_opcount == 0) {
+                $result = @pg_exec($this->connection, "begin;");
+                if (!$result) {
+                    return $this->pgsqlRaiseError();
+                }
+            }
+            $this->transaction_opcount++;
+        }
         $result = @pg_exec($this->connection, $query);
         if (!$result) {
             return $this->pgsqlRaiseError();
         }
-        if ($this->autocommit && DB::isManip($query)) {
-            $this->commit();
-        }
         // Determine which queries that should return data, and which
         // should return an error code only.
-        if (DB::isManip($query)) {
+        if ($ismanip) {
             $this->affected = @pg_cmdtuples($result);
             return DB_OK;
         } elseif (preg_match('/^\s*(SELECT)\s/i', $query) &&
@@ -413,9 +423,9 @@
     // {{{ execute()
 
     /**
-     * @return int returns a PostgreSQL result resource for successful
-     * SELECT queries, DB_OK for other successful queries.  A DB error
-     * code is returned on failure.
+     * @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)
     {
@@ -436,6 +446,8 @@
      */
     function autoCommit($onoff = false)
     {
+        // XXX if $this->transaction_opcount > 0, we should probably
+        // issue a warning here.
         $this->autocommit = $onoff ? true : false;
         return DB_OK;
     }
@@ -444,15 +456,18 @@
     // {{{ commit()
 
     /**
-     * Commit transactions on the current connection
+     * Commit the current transaction.
      */
     function commit()
     {
-        // hack to shut up error messages from ext/pgsql or libpq.a
-        @fclose(@fopen("php://stderr", "w"));
-        $result = @pg_exec($this->connection, "end;");
-        if (!$result) {
-            return $this->pgsqlRaiseError();
+        if ($this->transaction_opcount > 0) {
+            // (disabled) hack to shut up error messages from libpq.a
+            //@fclose(@fopen("php://stderr", "w"));
+            $result = @pg_exec($this->connection, "end;");
+            $this->transaction_opcount = 0;
+            if (!$result) {
+                return $this->pgsqlRaiseError();
+            }
         }
         return DB_OK;
     }
@@ -461,13 +476,16 @@
     // {{{ rollback()
 
     /**
-     * Roll back all uncommitted transactions on the current connection.
+     * Roll back (undo) the current transaction.
      */
     function rollback()
     {
-        $result = @pg_exec($this->connection, "abort;");
-        if (!$result) {
-            return $this->pgsqlRaiseError();
+        if ($this->transaction_opcount > 0) {
+            $result = @pg_exec($this->connection, "abort;");
+            $this->transaction_opcount = 0;
+            if (!$result) {
+                return $this->pgsqlRaiseError();
+            }
         }
         return DB_OK;
     }
Index: php4/pear/DB/sybase.php
diff -u php4/pear/DB/sybase.php:1.14 php4/pear/DB/sybase.php:1.15
--- php4/pear/DB/sybase.php:1.14        Fri Feb 16 09:14:40 2001
+++ php4/pear/DB/sybase.php     Mon Feb 19 04:22:26 2001
@@ -16,7 +16,7 @@
 // | Authors: Sterling Hughes <[EMAIL PROTECTED]>                          |
 // +----------------------------------------------------------------------+
 //
-// $Id: sybase.php,v 1.14 2001/02/16 17:14:40 chagenbu Exp $
+// $Id: sybase.php,v 1.15 2001/02/19 12:22:26 ssb Exp $
 //
 // Database independent query interface definition for PHP's Sybase
 // extension.
@@ -61,6 +61,7 @@
                if (!$dsninfo || !$dsninfo['phptype']) {
                        return $this->raiseError(); 
                }
+        $this->dsn = $dsninfo;
                $dbhost = $dsninfo['hostspec'] ? $dsninfo['hostspec'] : 'localhost';
                $connect_function = $persistent ? 'sybase_pconnect' : 'sybase_connect';
                $conn = $dbhost ? $connect_function($dbhost) : false;

Index: php4/pear/DB/tests/transactions.inc
+++ php4/pear/DB/tests/transactions.inc
<?php

// View the table from a separate connection so we don't disturb
// the transaction.
$dbh2 = DB::connect($dbh->dsn);

function dumptable() {
    global $dbh, $dbh2;
    printf("%s ops=%d\n", implode(" ", $dbh->getCol("SELECT b FROM phptest")),
           $dbh->transaction_opcount);
}
$dbh->setErrorHandling(PEAR_ERROR_DIE);
$dbh->autoCommit(true);
$dbh->query("INSERT INTO phptest VALUES(1, 'one', 'One', '2001-02-19')");
print "after autocommit: ";
dumptable();
$dbh->autoCommit(false);
$dbh->query("INSERT INTO phptest VALUES(2, 'two', 'Two', '2001-02-20')");
$dbh->query("INSERT INTO phptest VALUES(3, 'three', 'Three', '2001-02-21')");
print "before commit: ";
dumptable();
$dbh->commit();
print "after commit: ";
dumptable();
$dbh->query("INSERT INTO phptest VALUES(4, 'four', 'Four', '2001-02-22')");
$dbh->query("INSERT INTO phptest VALUES(5, 'five', 'Five', '2001-02-23')");
print "before rollback: ";
dumptable();
$dbh->rollback();
print "after rollback: ";
dumptable();
$dbh->autoCommit(true);
$dbh->query("INSERT INTO phptest VALUES(6, 'six', 'Six', '2001-02-24')");
$dbh->query("INSERT INTO phptest VALUES(7, 'seven', 'Seven', '2001-02-25')");
print "before autocommit+rollback: ";
dumptable();
$dbh->rollback();
print "after autocommit+rollback: ";
dumptable();

print "testing that select doesn't disturbe opcount: ";
$dbh->autoCommit(false);
$dbh->simpleQuery("SELECT * FROM phptest");
$dbh->simpleQuery("SELECT a,c FROM phptest");
$dbh->simpleQuery("SELECT b,d FROM phptest");
if ($dbh->transaction_opcount == 0) {
    print "ok\n";
} else {
    print "failed (count=$dbh->transaction_opcount)\n";
}

?>

Index: php4/pear/DB/tests/pgsql/011.phpt
+++ php4/pear/DB/tests/pgsql/011.phpt
--TEST--
DB_pgsql transaction test
--SKIPIF--
<?php require "skipif.inc"; ?>
--FILE--
<?php
require "connect.inc";
require "mktable.inc";
require "../transactions.inc";
?>
--EXPECT--
after autocommit: bing one ops=0
before commit: bing one two three ops=2
after commit: bing one two three ops=0
before rollback: bing one two three four five ops=2
after rollback: bing one two three ops=0
before autocommit+rollback: bing one two three six seven ops=0
after autocommit+rollback: bing one two three six seven ops=0
testing that select doesn't disturbe opcount: ok

-- 
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