Release plat/al core v1.1.13
[platal.git] / classes / xdb.php
index c14f116..6239b4b 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()) {
@@ -122,6 +122,11 @@ class XDB
         return self::queryv(func_get_args());
     }
 
+    public static function rawQuery($query)
+    {
+        return new XDBResult($query);
+    }
+
     public static function format()
     {
         return self::prepare(func_get_args());
@@ -180,16 +185,89 @@ class XDB
         return self::run(XDB::prepare($args));
     }
 
+    public static function rawExecute($query)
+    {
+        global $globals;
+        if ($globals->mode != 'rw') {
+            return;
+        }
+        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()));
     }
 
+    public static function rawIterator($query)
+    {
+        return new XDBIterator($query);
+    }
+
     public static function iterRow()
     {
         return new XDBIterator(self::prepare(func_get_args()), MYSQL_NUM);
     }
 
+    public static function rawIterRow($query)
+    {
+        return new XDBIterator($query, MYSQL_NUM);
+    }
+
     private static function findQuery($params, $default = array())
     {
         for ($i = 0 ; $i < count($default) ; ++$i) {
@@ -219,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.
@@ -229,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.
@@ -254,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()
@@ -564,5 +672,5 @@ class XDBIterator extends XDBResult implements PlIterator
     }
 }
 
-// vim:set et sw=4 sts=4 sws=4 foldmethod=marker enc=utf-8:
+// vim:set et sw=4 sts=4 sws=4 foldmethod=marker fenc=utf-8:
 ?>