PluginHost/save_data: use separate PDO connection to prevent issues with nested transactions
This commit is contained in:
parent
da926067ab
commit
208e02c47d
|
@ -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();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue