aboutsummaryrefslogtreecommitdiffstats
path: root/phpBB/phpbb/db/driver/sqlite3.php
diff options
context:
space:
mode:
authorMarc Alexander <admin@m-a-styles.de>2015-10-23 16:34:01 +0200
committerMate Bartus <mate.bartus@gmail.com>2015-10-23 20:47:56 +0200
commitdf53d409226dd9a0ccbeac93f017a4363a1c98cf (patch)
tree80ea434d2c94dea637068b89abc8df9e5da462ef /phpBB/phpbb/db/driver/sqlite3.php
parentd34d6378bc7db03daa763aa54739b69b07610702 (diff)
downloadforums-df53d409226dd9a0ccbeac93f017a4363a1c98cf.tar
forums-df53d409226dd9a0ccbeac93f017a4363a1c98cf.tar.gz
forums-df53d409226dd9a0ccbeac93f017a4363a1c98cf.tar.bz2
forums-df53d409226dd9a0ccbeac93f017a4363a1c98cf.tar.xz
forums-df53d409226dd9a0ccbeac93f017a4363a1c98cf.zip
[ticket/14044] Automatically trigger rollback on insert in transaction
This will cause the sqlite3 driver to automatically rollback transactions if an insert fails during a transaction. Other dbms trigger a rollback inside the sql_error() function with a rollback command. However, this manual rollback command might fail on sqlite3 due to ongoing queries. With this change, sqlite3 itself will abort any ongoing queries and initiate the rollback automatically. Since manually triggered rollbacks will fail after the rollback was started automatically, we catch exceptions output by the exec() command during rollback and any exception that might be thrown by fetchArray() due to aborted queries. PHPBB3-14044
Diffstat (limited to 'phpBB/phpbb/db/driver/sqlite3.php')
-rw-r--r--phpBB/phpbb/db/driver/sqlite3.php10
1 files changed, 8 insertions, 2 deletions
diff --git a/phpBB/phpbb/db/driver/sqlite3.php b/phpBB/phpbb/db/driver/sqlite3.php
index 2000acb251..0508500c52 100644
--- a/phpBB/phpbb/db/driver/sqlite3.php
+++ b/phpBB/phpbb/db/driver/sqlite3.php
@@ -102,7 +102,7 @@ class sqlite3 extends \phpbb\db\driver\driver
break;
case 'rollback':
- return $this->dbo->exec('ROLLBACK');
+ return @$this->dbo->exec('ROLLBACK');
break;
}
@@ -134,6 +134,11 @@ class sqlite3 extends \phpbb\db\driver\driver
if ($this->query_result === false)
{
+ if ($this->transaction === true && strpos($query, 'INSERT') === 0)
+ {
+ $query = preg_replace('/^INSERT INTO/', 'INSERT OR ROLLBACK INTO', $query);
+ }
+
if (($this->query_result = @$this->dbo->query($query)) === false)
{
// Try to recover a lost database connection
@@ -225,6 +230,7 @@ class sqlite3 extends \phpbb\db\driver\driver
if ($query_id === false)
{
+ /** @var \SQLite3Result $query_id */
$query_id = $this->query_result;
}
@@ -233,7 +239,7 @@ class sqlite3 extends \phpbb\db\driver\driver
return $cache->sql_fetchrow($query_id);
}
- return is_object($query_id) ? $query_id->fetchArray(SQLITE3_ASSOC) : false;
+ return is_object($query_id) ? @$query_id->fetchArray(SQLITE3_ASSOC) : false;
}
/**