Allow overriding of PlSession::fillSession()
[platal.git] / classes / xdb.php
index 1014c71..dd23938 100644 (file)
@@ -1,6 +1,6 @@
 <?php
 /***************************************************************************
- *  Copyright (C) 2003-2010 Polytechnique.org                              *
+ *  Copyright (C) 2003-2011 Polytechnique.org                              *
  *  http://opensource.polytechnique.org/                                   *
  *                                                                         *
  *  This program is free software; you can redistribute it and/or modify   *
@@ -86,7 +86,7 @@ class XDB
 
         if ($globals->debug & DEBUG_BT) {
             $explain = array();
-            if (strpos($query, 'FOUND_ROWS()') === false) {
+            if (strpos($query, 'FOUND_ROWS()') === false && strpos($query, 'AUTOCOMMIT') === false) {
                 $res = self::$mysqli->query("EXPLAIN $query");
                 if ($res) {
                     while ($row = $res->fetch_assoc()) {
@@ -194,6 +194,60 @@ class XDB
         return self::run($query);
     }
 
+    private static $inTransaction = false;
+    public static function startTransaction()
+    {
+        if (self::$inTransaction) {
+            throw new XDBException('START TRANSACTION', 'Already in a transaction');
+        }
+        self::$inTransaction = true;
+        self::rawExecute('SET AUTOCOMMIT = 0');
+        self::rawExecute('START TRANSACTION');
+    }
+
+    public static function commit()
+    {
+        self::rawExecute('COMMIT');
+        self::rawExecute('SET AUTOCOMMIT = 1');
+        self::$inTransaction = false;
+    }
+
+    public static function rollback()
+    {
+        self::rawExecute('ROLLBACK');
+        self::rawExecute('SET AUTOCOMMIT = 1');
+        self::$inTransaction = false;
+    }
+
+    public static function runTransactionV($callback, array $args)
+    {
+        self::startTransaction();
+        try {
+            if (call_user_func_array($callback, $args)) {
+                self::commit();
+                return true;
+            } else {
+                self::rollback();
+                return false;
+            }
+        } catch (Exception $e) {
+            self::rollback();
+            throw $e;
+        }
+    }
+
+    /** This function takes a callback followed by the arguments to be passed to the callback
+     * as arguments. It starts a transaction and execute the callback. If the callback fails
+     * (return false or raise an exception), the transaction is rollbacked, if the callback
+     * succeeds (return true), the transaction is committed.
+     */
+    public static function runTransaction()
+    {
+        $args = func_get_args();
+        $cb = array_shift($args);
+        return self::runTransactionV($cb, $args);
+    }
+
     public static function iterator()
     {
         return new XDBIterator(self::prepare(func_get_args()));
@@ -243,6 +297,11 @@ class XDB
         return self::queryv($query)->fetchAllRow($args[0], $args[1]);
     }
 
+    public static function rawFetchAllRow($query, $id = false, $keep_array = false)
+    {
+        return self::rawQuery($query)->fetchAllRow($id, $keep_array);
+    }
+
     /** Fetch all rows returned by the given query.
      * This functions can take 2 optional arguments (cf XDBResult::fetchAllAssoc()).
      * Optional arguments are given *before* the query.
@@ -253,24 +312,44 @@ class XDB
         return self::queryv($query)->fetchAllAssoc($args[0], $args[1]);
     }
 
+    public static function rawFetchAllAssoc($query, $id = false, $keep_array = false)
+    {
+        return self::rawQuery($query)->fetchAllAssoc($id, $keep_array);
+    }
+
     public static function fetchOneCell()
     {
         list($args, $query) = self::findQuery(func_get_args());
         return self::queryv($query)->fetchOneCell();
     }
 
+    public static function rawFetchOneCell($query)
+    {
+        return self::rawQuery($query)->fetchOneCell();
+    }
+
     public static function fetchOneRow()
     {
         list($args, $query) = self::findQuery(func_get_args());
         return self::queryv($query)->fetchOneRow();
     }
 
+    public static function rawFetchOneRow($query)
+    {
+        return self::rawQuery($query)->fetchOneRow();
+    }
+
     public static function fetchOneAssoc()
     {
         list($args, $query) = self::findQuery(func_get_args());
         return self::queryv($query)->fetchOneAssoc();
     }
 
+    public static function rawFetchOneAssoc($query)
+    {
+        return self::rawQuery($query)->fetchOneAssoc();
+    }
+
     /** Fetch a column from the result of the given query.
      * This functions can take 1 optional arguments (cf XDBResult::fetchColumn()).
      * Optional arguments are given *before* the query.
@@ -278,7 +357,12 @@ class XDB
     public static function fetchColumn()
     {
         list($args, $query) = self::findQuery(func_get_args(), array(0));
-        return self::queryv($query)->fetchColumn();
+        return self::queryv($query)->fetchColumn($args[0]);
+    }
+
+    public static function rawFetchColumn($query, $key = 0)
+    {
+        return self::rawQuery($query)->fetchColumn($key);
     }
 
     public static function insertId()