PluginHost/save_data: use separate PDO connection to prevent issues with nested transactions

This commit is contained in:
Andrew Dolgov 2020-03-10 08:14:00 +03:00
parent da926067ab
commit 208e02c47d
1 changed files with 12 additions and 6 deletions

View File

@ -1,6 +1,9 @@
<?php <?php
class PluginHost { class PluginHost {
private $pdo; private $pdo;
/* separate handle for plugin data so transaction while saving wouldn't clash with possible main
tt-rss code transactions; only initialized when first needed */
private $pdo_data;
private $hooks = array(); private $hooks = array();
private $plugins = array(); private $plugins = array();
private $handlers = array(); private $handlers = array();
@ -73,7 +76,6 @@ class PluginHost {
function __construct() { function __construct() {
$this->pdo = Db::pdo(); $this->pdo = Db::pdo();
$this->storage = array(); $this->storage = array();
} }
@ -361,9 +363,13 @@ class PluginHost {
private function save_data($plugin) { private function save_data($plugin) {
if ($this->owner_uid) { if ($this->owner_uid) {
$this->pdo->beginTransaction();
$sth = $this->pdo->prepare("SELECT id FROM ttrss_plugin_storage WHERE if (!$this->pdo_data)
$this->pdo_data = Db::instance()->pdo_connect();
$this->pdo_data->beginTransaction();
$sth = $this->pdo_data->prepare("SELECT id FROM ttrss_plugin_storage WHERE
owner_uid= ? AND name = ?"); owner_uid= ? AND name = ?");
$sth->execute([$this->owner_uid, $plugin]); $sth->execute([$this->owner_uid, $plugin]);
@ -373,18 +379,18 @@ class PluginHost {
$content = serialize($this->storage[$plugin]); $content = serialize($this->storage[$plugin]);
if ($sth->fetch()) { if ($sth->fetch()) {
$sth = $this->pdo->prepare("UPDATE ttrss_plugin_storage SET content = ? $sth = $this->pdo_data->prepare("UPDATE ttrss_plugin_storage SET content = ?
WHERE owner_uid= ? AND name = ?"); WHERE owner_uid= ? AND name = ?");
$sth->execute([(string)$content, $this->owner_uid, $plugin]); $sth->execute([(string)$content, $this->owner_uid, $plugin]);
} else { } else {
$sth = $this->pdo->prepare("INSERT INTO ttrss_plugin_storage $sth = $this->pdo_data->prepare("INSERT INTO ttrss_plugin_storage
(name,owner_uid,content) VALUES (name,owner_uid,content) VALUES
(?, ?, ?)"); (?, ?, ?)");
$sth->execute([$plugin, $this->owner_uid, (string)$content]); $sth->execute([$plugin, $this->owner_uid, (string)$content]);
} }
$this->pdo->commit(); $this->pdo_data->commit();
} }
} }