Version 1
[yaffs-website] / vendor / gabordemooij / redbean / RedBeanPHP / Util / Transaction.php
diff --git a/vendor/gabordemooij/redbean/RedBeanPHP/Util/Transaction.php b/vendor/gabordemooij/redbean/RedBeanPHP/Util/Transaction.php
new file mode 100644 (file)
index 0000000..35e70f8
--- /dev/null
@@ -0,0 +1,90 @@
+<?php
+
+namespace RedBeanPHP\Util;
+
+use RedBeanPHP\OODB as OODB;
+use RedBeanPHP\OODBBean as OODBBean;
+use RedBeanPHP\RedException as RedException;
+use RedBeanPHP\Adapter as Adapter;
+
+/**
+ * Transaction Helper
+ *
+ * This code was originally part of the facade, however it has
+ * been decided to remove unique features to service classes like
+ * this to make them available to developers not using the facade class.
+ *
+ * Database transaction helper. This is a convenience class
+ * to perform a callback in a database transaction. This class
+ * contains a method to wrap your callback in a transaction.
+ *
+ * @file    RedBeanPHP/Util/Transaction.php
+ * @author  Gabor de Mooij and the RedBeanPHP Community
+ * @license BSD/GPLv2
+ *
+ * @copyright
+ * copyright (c) G.J.G.T. (Gabor) de Mooij and the RedBeanPHP Community
+ * This source file is subject to the BSD/GPLv2 License that is bundled
+ * with this source code in the file license.txt.
+ */
+class Transaction
+{
+       /**
+        * Wraps a transaction around a closure or string callback.
+        * If an Exception is thrown inside, the operation is automatically rolled back.
+        * If no Exception happens, it commits automatically.
+        * It also supports (simulated) nested transactions (that is useful when
+        * you have many methods that needs transactions but are unaware of
+        * each other).
+        *
+        * Example:
+        *
+        * <code>
+        * $from = 1;
+        * $to = 2;
+        * $amount = 300;
+        *
+        * R::transaction(function() use($from, $to, $amount)
+        * {
+        *   $accountFrom = R::load('account', $from);
+        *   $accountTo = R::load('account', $to);
+        *   $accountFrom->money -= $amount;
+        *   $accountTo->money += $amount;
+        *   R::store($accountFrom);
+        *   R::store($accountTo);
+        * });
+        * </code>
+        *
+        * @param Adapter  $adapter  Database Adapter providing transaction mechanisms.
+        * @param callable $callback Closure (or other callable) with the transaction logic
+        *
+        * @return mixed
+        */
+       public static function transaction( Adapter $adapter, $callback )
+       {
+               if ( !is_callable( $callback ) ) {
+                       throw new RedException( 'R::transaction needs a valid callback.' );
+               }
+
+               static $depth = 0;
+               $result = null;
+               try {
+                       if ( $depth == 0 ) {
+                               $adapter->startTransaction();
+                       }
+                       $depth++;
+                       $result = call_user_func( $callback ); //maintain 5.2 compatibility
+                       $depth--;
+                       if ( $depth == 0 ) {
+                               $adapter->commit();
+                       }
+               } catch ( \Exception $exception ) {
+                       $depth--;
+                       if ( $depth == 0 ) {
+                               $adapter->rollback();
+                       }
+                       throw $exception;
+               }
+               return $result;
+       }
+}