Переглянути джерело

[WIP] [#48] Added defensive code for DatabaseConnection drivers that don't support transactions

Chris Smith 5 роки тому
батько
коміт
3d27c67513
1 змінених файлів з 36 додано та 2 видалено
  1. 36 2
      src/Extracting/DatabaseTransactionHelpers.php

+ 36 - 2
src/Extracting/DatabaseTransactionHelpers.php

@@ -15,7 +15,14 @@ trait DatabaseTransactionHelpers
 
         foreach ($connections as $conn) {
             try {
-                app('db')->connection($conn)->beginTransaction();
+                tap(
+                    app('db')->connection($conn),
+                    function ($driver) {
+                        if (self::driverSupportsTransactions($driver)) {
+                            $driver->beginTransaction();
+                        }
+                    }
+                );
             } catch (Exception $e) {
             }
         }
@@ -30,9 +37,36 @@ trait DatabaseTransactionHelpers
 
         foreach ($connections as $conn) {
             try {
-                app('db')->connection($conn)->rollBack();
+                tap(
+                    app('db')->connection($conn),
+                    function ($driver) {
+                        if (self::driverSupportsTransactions($driver)) {
+                            $driver->rollBack();
+                        }
+                    }
+                );
             } catch (Exception $e) {
             }
         }
     }
+
+    /**
+     * Assesses whether or not the "PDO" driver provided supports transactions
+     *
+     * @param mixed $driver Driver prodicted for particular connection
+     *
+     * @return boolean
+     */
+    private static function driverSupportsTransactions($driver)
+    {
+        $methods = [ 'beginTransaction', 'rollback' ];
+
+        foreach ($methods as $method) {
+            if (! method_exists($driver, $method)) {
+                return false;
+            }
+        }
+
+        return true;
+    }
 }