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
class PluginHost {
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 $plugins = array();
private $handlers = array();
@ -73,7 +76,6 @@ class PluginHost {
function __construct() {
$this->pdo = Db::pdo();
$this->storage = array();
}
@ -361,9 +363,13 @@ class PluginHost {
private function save_data($plugin) {
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 = ?");
$sth->execute([$this->owner_uid, $plugin]);
@ -373,18 +379,18 @@ class PluginHost {
$content = serialize($this->storage[$plugin]);
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 = ?");
$sth->execute([(string)$content, $this->owner_uid, $plugin]);
} 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
(?, ?, ?)");
$sth->execute([$plugin, $this->owner_uid, (string)$content]);
}
$this->pdo->commit();
$this->pdo_data->commit();
}
}