]> git.mxchange.org Git - friendica.git/commitdiff
Fix DBA::lock() testability because of "autocommits"
authorPhilipp <admin@philipp.info>
Mon, 24 May 2021 18:30:56 +0000 (20:30 +0200)
committerPhilipp <admin@philipp.info>
Mon, 24 May 2021 20:37:16 +0000 (22:37 +0200)
tests/DatabaseTestTrait.php
tests/Util/Database/ExtendedPDO.php
tests/Util/Database/StaticDatabase.php

index 7d255c693b5b9ff996b5ee28d4771b15469293ca..eae5ce2ac9dd5c3a0eb24a69e120dd713266677b 100644 (file)
@@ -34,6 +34,8 @@ trait DatabaseTestTrait
                StaticDatabase::statConnect($_SERVER);
                // Rollbacks every DB usage (in case the test couldn't call tearDown)
                StaticDatabase::statRollback();
+               // Rollback the first, outer transaction just 2 be sure
+               StaticDatabase::getGlobConnection()->rollBack();
                // Start the first, outer transaction
                StaticDatabase::getGlobConnection()->beginTransaction();
        }
index 6a59d2aeeca5aa01bf45a3c72ad106477222b4cc..c9ce42b3ee79daa2a1858c012f48d85a652cb052 100644 (file)
@@ -69,7 +69,7 @@ class ExtendedPDO extends PDO
        {
                if($this->_transactionDepth <= 0 || !$this->hasSavepoint()) {
                        parent::beginTransaction();
-                       $this->_transactionDepth = $this->_transactionDepth < 0 ? 0 : $this->_transactionDepth;
+                       $this->_transactionDepth = 0;
                } else {
                        $this->exec("SAVEPOINT LEVEL{$this->_transactionDepth}");
                }
@@ -84,14 +84,15 @@ class ExtendedPDO extends PDO
         */
        public function commit()
        {
+               // We don't want to "really" commit something, so skip the most outer hierarchy
+               if ($this->_transactionDepth <= 1 && $this->hasSavepoint()) {
+                       $this->_transactionDepth = $this->_transactionDepth <= 0 ? 0 : 1;
+                       return true;
+               }
+
                $this->_transactionDepth--;
 
-               if($this->_transactionDepth <= 0 || !$this->hasSavepoint()) {
-                       parent::commit();
-                       $this->_transactionDepth = $this->_transactionDepth < 0 ? 0 : $this->_transactionDepth;
-               } else {
-                       $this->exec("RELEASE SAVEPOINT LEVEL{$this->_transactionDepth}");
-               }
+               $this->exec("RELEASE SAVEPOINT LEVEL{$this->_transactionDepth}");
        }
 
        /**
@@ -102,14 +103,15 @@ class ExtendedPDO extends PDO
         */
        public function rollBack()
        {
-               if ($this->_transactionDepth <= 0) {
-                       throw new PDOException('Rollback error : There is no transaction started');
-               }
-
                $this->_transactionDepth--;
 
-               if($this->_transactionDepth == 0 || !$this->hasSavepoint()) {
-                       parent::rollBack();
+               if($this->_transactionDepth <= 0 || !$this->hasSavepoint()) {
+                       $this->_transactionDepth = 0;
+                       try {
+                               parent::rollBack();
+                       } catch (PDOException $e) {
+                               // this shouldn't happen, but it does ...
+                       }
                } else {
                        $this->exec("ROLLBACK TO SAVEPOINT LEVEL{$this->_transactionDepth}");
                }
index 48b392978811934f53c82025da99ea51d644091d..3bf6396a94bbf3d4dc9be99796a6df0f294e2213 100644 (file)
@@ -39,6 +39,9 @@ class StaticDatabase extends Database
         */
        private static $staticConnection;
 
+       /** @var bool  */
+       private $_locked = false;
+
        /**
         * Override the behaviour of connect, due there is just one, static connection at all
         *
@@ -77,6 +80,31 @@ class StaticDatabase extends Database
                return true;
        }
 
+       /** Mock for locking tables */
+       public function lock($table)
+       {
+               if ($this->_locked) {
+                       return false;
+               }
+
+               $this->in_transaction = true;
+               $this->_locked = true;
+
+               return true;
+       }
+
+       /** Mock for unlocking tables */
+       public function unlock()
+       {
+               // See here: https://dev.mysql.com/doc/refman/5.7/en/lock-tables-and-transactions.html
+               $this->performCommit();
+
+               $this->in_transaction = false;
+               $this->_locked = false;
+
+               return true;
+       }
+
        /**
         * Does a commit
         *
@@ -163,18 +191,6 @@ class StaticDatabase extends Database
                return self::$staticConnection;
        }
 
-       /**
-        * Perform a global commit for every nested transaction of the static connection
-        */
-       public static function statCommit()
-       {
-               if (isset(self::$staticConnection)) {
-                       while (self::$staticConnection->getTransactionDepth() > 0) {
-                               self::$staticConnection->commit();
-                       }
-               }
-       }
-
        /**
         * Perform a global rollback for every nested transaction of the static connection
         */