diff --git a/core/database.class.php b/core/database.class.php index f9072139..2a728889 100644 --- a/core/database.class.php +++ b/core/database.class.php @@ -279,6 +279,12 @@ class Database { */ public $cache = null; + /** + * A boolean flag to track if we already have an active transaction. + * (ie: True if beginTransaction() already called) + */ + public $transaction = false; + /** * For now, only connect to the cache, as we will pretty much certainly * need it. There are some pages where all the data is in cache, so the @@ -327,7 +333,7 @@ class Database { $this->engine->init($this->db); // FIXME: this causes problems with running via the PHP CLI - $this->db->beginTransaction(); + $this->beginTransaction(); } private function connect_engine() { @@ -348,12 +354,23 @@ class Database { } } + public function beginTransaction() { + if ($this->transaction === false) { + $this->db->beginTransaction(); + } + } + public function commit() { - if(!is_null($this->db)) return $this->db->commit(); + if(!is_null($this->db) && $this->transaction === true) { + $this->transaction = false; + return $this->db->commit(); + } } public function rollback() { - if(!is_null($this->db)) return $this->db->rollback(); + if(!is_null($this->db) && $this->transaction === true) { + $this->transaction = false; + return $this->db->rollback(); } public function escape($input) { diff --git a/tests/all_tests.php b/tests/all_tests.php index a0a5d0ca..a679fa3e 100644 --- a/tests/all_tests.php +++ b/tests/all_tests.php @@ -54,10 +54,14 @@ send_event(new InitExtEvent()); send_event(new UserCreationEvent("demo", "demo", "")); $database->commit(); // Need to commit the new user to the database. +$database->beginTransaction(); + send_event(new UserCreationEvent("test", "test", "")); $database->commit(); // Need to commit the new user to the database. +$database->beginTransaction(); + // Now we can run all the tests. $all = new TestFinder(""); $results = $all->run(new TextReporter());