feeds: PDO progress

This commit is contained in:
Andrew Dolgov 2017-12-02 15:04:11 +03:00
parent ef83c69404
commit 91d679667e
1 changed files with 140 additions and 163 deletions

View File

@ -25,7 +25,6 @@ class Pref_Feeds extends Handler_Protected {
title = ? WHERE id = ? AND owner_uid = ?"); title = ? WHERE id = ? AND owner_uid = ?");
$sth->execute([$title, $id, $_SESSION['uid']]); $sth->execute([$title, $id, $_SESSION['uid']]);
} }
return;
} }
private function get_category_items($cat_id) { private function get_category_items($cat_id) {
@ -109,8 +108,6 @@ class Pref_Feeds extends Handler_Protected {
else else
$search = ""; $search = "";
if ($search) $search_qpart = " AND LOWER(title) LIKE LOWER('%$search%')";
$root = array(); $root = array();
$root['id'] = 'root'; $root['id'] = 'root';
$root['name'] = __('Feeds'); $root['name'] = __('Feeds');
@ -162,10 +159,9 @@ class Pref_Feeds extends Handler_Protected {
$root['items'] = array_merge($root['items'], $cat['items']); $root['items'] = array_merge($root['items'], $cat['items']);
} }
$result = db_query("SELECT * FROM $sth = $this->pdo->prepare("SELECT * FROM
ttrss_labels2 WHERE owner_uid = ".$_SESSION['uid']." ORDER by caption"); ttrss_labels2 WHERE owner_uid = ? ORDER by caption");
$sth->execute([$_SESSION['uid']]);
if (db_num_rows($result) > 0) {
if (get_pref('ENABLE_FEED_CATS')) { if (get_pref('ENABLE_FEED_CATS')) {
$cat = $this->feedlist_init_cat(-2); $cat = $this->feedlist_init_cat(-2);
@ -173,7 +169,9 @@ class Pref_Feeds extends Handler_Protected {
$cat['items'] = array(); $cat['items'] = array();
} }
while ($line = db_fetch_assoc($result)) { $num_labels = 0;
while ($line = $sth->fetch()) {
++$num_labels;
$label_id = Labels::label_to_feed_id($line['id']); $label_id = Labels::label_to_feed_id($line['id']);
@ -185,6 +183,7 @@ class Pref_Feeds extends Handler_Protected {
array_push($cat['items'], $feed); array_push($cat['items'], $feed);
} }
if ($num_labels) {
if ($enable_cats) { if ($enable_cats) {
array_push($root['items'], $cat); array_push($root['items'], $cat);
} else { } else {
@ -197,10 +196,11 @@ class Pref_Feeds extends Handler_Protected {
$show_empty_cats = $_REQUEST['force_show_empty'] || $show_empty_cats = $_REQUEST['force_show_empty'] ||
($_REQUEST['mode'] != 2 && !$search); ($_REQUEST['mode'] != 2 && !$search);
$result = db_query("SELECT id, title FROM ttrss_feed_categories $sth = $this->pdo->prepare("SELECT id, title FROM ttrss_feed_categories
WHERE owner_uid = " . $_SESSION["uid"] . " AND parent_cat IS NULL ORDER BY order_id, title"); WHERE owner_uid = ? AND parent_cat IS NULL ORDER BY order_id, title");
$sth->execute([$_SESSION['uid']]);
while ($line = db_fetch_assoc($result)) { while ($line = $sth->fetch()) {
$cat = array(); $cat = array();
$cat['id'] = 'CAT:' . $line['id']; $cat['id'] = 'CAT:' . $line['id'];
$cat['bare_id'] = (int)$line['id']; $cat['bare_id'] = (int)$line['id'];
@ -236,13 +236,16 @@ class Pref_Feeds extends Handler_Protected {
$cat['unread'] = 0; $cat['unread'] = 0;
$cat['child_unread'] = 0; $cat['child_unread'] = 0;
$feed_result = db_query("SELECT id, title,last_error, $fsth = $this->pdo->prepare("SELECT id, title,last_error,
".SUBSTRING_FOR_DATE."(last_updated,1,19) AS last_updated ".SUBSTRING_FOR_DATE."(last_updated,1,19) AS last_updated
FROM ttrss_feeds FROM ttrss_feeds
WHERE cat_id IS NULL AND owner_uid = ".$_SESSION["uid"]. WHERE cat_id IS NULL AND
"$search_qpart ORDER BY order_id, title"); owner_uid = :uid AND
(:search = '' OR (LOWER(title) LIKE :search OR LOWER(feed_url) LIKE :search))
ORDER BY order_id, title");
$fsth->execute([":uid" => $_SESSION['uid'], ":search" => $search ? "%$search%" : ""]);
while ($feed_line = db_fetch_assoc($feed_result)) { while ($feed_line = $fsth->fetch()) {
$feed = array(); $feed = array();
$feed['id'] = 'FEED:' . $feed_line['id']; $feed['id'] = 'FEED:' . $feed_line['id'];
$feed['bare_id'] = (int)$feed_line['id']; $feed['bare_id'] = (int)$feed_line['id'];
@ -268,13 +271,15 @@ class Pref_Feeds extends Handler_Protected {
$root['param'] = vsprintf(_ngettext('(%d feed)', '(%d feeds)', (int) $num_children), $num_children); $root['param'] = vsprintf(_ngettext('(%d feed)', '(%d feeds)', (int) $num_children), $num_children);
} else { } else {
$feed_result = db_query("SELECT id, title, last_error, $fsth = $this->pdo->prepare("SELECT id, title, last_error,
".SUBSTRING_FOR_DATE."(last_updated,1,19) AS last_updated ".SUBSTRING_FOR_DATE."(last_updated,1,19) AS last_updated
FROM ttrss_feeds FROM ttrss_feeds
WHERE owner_uid = ".$_SESSION["uid"]. WHERE owner_uid = :uid AND
"$search_qpart ORDER BY order_id, title"); (:search = '' OR (LOWER(title) LIKE :search OR LOWER(feed_url) LIKE :search))
ORDER BY order_id, title");
$fsth->execute([":uid" => $_SESSION['uid'], ":search" => $search ? "%$search%" : ""]);
while ($feed_line = db_fetch_assoc($feed_result)) { while ($feed_line = $fsth->fetch()) {
$feed = array(); $feed = array();
$feed['id'] = 'FEED:' . $feed_line['id']; $feed['id'] = 'FEED:' . $feed_line['id'];
$feed['bare_id'] = (int)$feed_line['id']; $feed['bare_id'] = (int)$feed_line['id'];
@ -308,15 +313,15 @@ class Pref_Feeds extends Handler_Protected {
} }
function catsortreset() { function catsortreset() {
db_query("UPDATE ttrss_feed_categories $sth = $this->pdo->prepare("UPDATE ttrss_feed_categories
SET order_id = 0 WHERE owner_uid = " . $_SESSION["uid"]); SET order_id = 0 WHERE owner_uid = ?");
return; $sth->execute([$_SESSION['uid']]);
} }
function feedsortreset() { function feedsortreset() {
db_query("UPDATE ttrss_feeds $sth = $this->pdo->prepare("UPDATE ttrss_feeds
SET order_id = 0 WHERE owner_uid = " . $_SESSION["uid"]); SET order_id = 0 WHERE owner_uid = ?");
return; $sth->execute([$_SESSION['uid']]);
} }
private function process_category_order(&$data_map, $item_id, $parent_id = false, $nest_level = 0) { private function process_category_order(&$data_map, $item_id, $parent_id = false, $nest_level = 0) {
@ -335,12 +340,13 @@ class Pref_Feeds extends Handler_Protected {
$parent_bare_id = substr($parent_id, strpos($parent_id, ':')+1); $parent_bare_id = substr($parent_id, strpos($parent_id, ':')+1);
$parent_qpart = $parent_bare_id; $parent_qpart = $parent_bare_id;
} else { } else {
$parent_qpart = 'NULL'; $parent_qpart = null;
} }
db_query("UPDATE ttrss_feed_categories $sth = $this->pdo->prepare("UPDATE ttrss_feed_categories
SET parent_cat = $parent_qpart WHERE id = '$bare_item_id' AND SET parent_cat = ? WHERE id = ? AND
owner_uid = " . $_SESSION["uid"]); owner_uid = ?");
$sth->execute([$parent_qpart, $bare_item_id, $_SESSION['uid']]);
} }
$order_id = 1; $order_id = 1;
@ -358,30 +364,22 @@ class Pref_Feeds extends Handler_Protected {
if (strpos($id, "FEED") === 0) { if (strpos($id, "FEED") === 0) {
$cat_id = ($item_id != "root") ? $cat_id = ($item_id != "root") ? $bare_item_id : null;
$bare_item_id : "NULL";
$cat_qpart = ($cat_id != 0) ? "cat_id = '$cat_id'" : $sth = $this->pdo->prepare("UPDATE ttrss_feeds
"cat_id = NULL"; SET order_id = ?, cat_id = ?
WHERE id = ? AND owner_uid = ?");
db_query("UPDATE ttrss_feeds $sth->execute([$order_id, $cat_id ? $cat_id : null, $bare_id, $_SESSION['uid']]);
SET order_id = $order_id, $cat_qpart
WHERE id = '$bare_id' AND
owner_uid = " . $_SESSION["uid"]);
} else if (strpos($id, "CAT:") === 0) { } else if (strpos($id, "CAT:") === 0) {
$this->process_category_order($data_map, $item['_reference'], $item_id, $this->process_category_order($data_map, $item['_reference'], $item_id,
$nest_level+1); $nest_level+1);
if ($item_id != 'root') { $sth = $this->pdo->prepare("UPDATE ttrss_feed_categories
$parent_qpart = $bare_id; SET order_id = ? WHERE id = ? AND
} else { owner_uid = ?");
$parent_qpart = 'NULL'; $sth->execute([$order_id, $bare_id, $_SESSION['uid']]);
}
db_query("UPDATE ttrss_feed_categories
SET order_id = '$order_id' WHERE id = '$bare_id' AND
owner_uid = " . $_SESSION["uid"]);
} }
} }
@ -423,67 +421,28 @@ class Pref_Feeds extends Handler_Protected {
} }
$this->process_category_order($data_map, $root_item); $this->process_category_order($data_map, $root_item);
/* foreach ($data['items'][0]['items'] as $item) {
$id = $item['_reference'];
$bare_id = substr($id, strpos($id, ':')+1);
++$cat_order_id;
if ($bare_id > 0) {
db_query("UPDATE ttrss_feed_categories
SET order_id = '$cat_order_id' WHERE id = '$bare_id' AND
owner_uid = " . $_SESSION["uid"]);
} }
$feed_order_id = 0;
if (is_array($data_map[$id])) {
foreach ($data_map[$id] as $feed) {
$id = $feed['_reference'];
$feed_id = substr($id, strpos($id, ':')+1);
if ($bare_id != 0)
$cat_query = "cat_id = '$bare_id'";
else
$cat_query = "cat_id = NULL";
db_query("UPDATE ttrss_feeds
SET order_id = '$feed_order_id',
$cat_query
WHERE id = '$feed_id' AND
owner_uid = " . $_SESSION["uid"]);
++$feed_order_id;
}
}
} */
}
return;
} }
function removeicon() { function removeicon() {
$feed_id = $_REQUEST["feed_id"]; $feed_id = $_REQUEST["feed_id"];
$result = db_query("SELECT id FROM ttrss_feeds $sth = $this->pdo->prepare("SELECT id FROM ttrss_feeds
WHERE id = '$feed_id' AND owner_uid = ". $_SESSION["uid"]); WHERE id = ? AND owner_uid = ?");
$sth->execute([$feed_id, $_SESSION['uid']]);
if (db_num_rows($result) != 0) { if ($row = $sth->fetch()) {
@unlink(ICONS_DIR . "/$feed_id.ico"); @unlink(ICONS_DIR . "/$feed_id.ico");
db_query("UPDATE ttrss_feeds SET favicon_avg_color = NULL $sth = $this->pdo->prepare("UPDATE ttrss_feeds SET favicon_avg_color = NULL
where id = '$feed_id'"); where id = ?");
$sth->execute([$feed_id]);
} }
return;
} }
function uploadicon() { function uploadicon() {
header("Content-type: text/html"); header("Content-type: text/html");
$tmp_file = false;
if (is_uploaded_file($_FILES['icon_file']['tmp_name'])) { if (is_uploaded_file($_FILES['icon_file']['tmp_name'])) {
$tmp_file = tempnam(CACHE_DIR . '/upload', 'icon'); $tmp_file = tempnam(CACHE_DIR . '/upload', 'icon');
@ -503,15 +462,18 @@ class Pref_Feeds extends Handler_Protected {
if (is_file($icon_file) && $feed_id) { if (is_file($icon_file) && $feed_id) {
if (filesize($icon_file) < 65535) { if (filesize($icon_file) < 65535) {
$result = db_query("SELECT id FROM ttrss_feeds $sth = $this->pdo->prepare("SELECT id FROM ttrss_feeds
WHERE id = '$feed_id' AND owner_uid = ". $_SESSION["uid"]); WHERE id = ? AND owner_uid = ?");
$sth->execute([$feed_id, $_SESSION['uid']]);
if (db_num_rows($result) != 0) { if ($row = $sth->fetch()) {
@unlink(ICONS_DIR . "/$feed_id.ico"); @unlink(ICONS_DIR . "/$feed_id.ico");
if (rename($icon_file, ICONS_DIR . "/$feed_id.ico")) { if (rename($icon_file, ICONS_DIR . "/$feed_id.ico")) {
db_query("UPDATE ttrss_feeds SET
$sth = $this->pdo->prepare("UPDATE ttrss_feeds SET
favicon_avg_color = '' favicon_avg_color = ''
WHERE id = '$feed_id'"); WHERE id = ?");
$sth->execute([$feed_id]);
$rc = 0; $rc = 0;
} }
@ -963,11 +925,11 @@ class Pref_Feeds extends Handler_Protected {
function editsaveops($batch) { function editsaveops($batch) {
$feed_title = trim($_POST["title"]); $feed_title = trim($_POST["title"]);
$feed_link = trim($_POST["feed_url"]); $feed_url = trim($_POST["feed_url"]);
$upd_intl = (int) $_POST["update_interval"]; $upd_intl = (int) $_POST["update_interval"];
$purge_intl = (int) $_POST["purge_interval"]; $purge_intl = (int) $_POST["purge_interval"];
$feed_id = (int) $_POST["id"]; /* editSave */ $feed_id = (int) $_POST["id"]; /* editSave */
$feed_ids = $_POST["ids"]; /* batchEditSave */ $feed_ids = explode(",", $_POST["ids"]); /* batchEditSave */
$cat_id = (int) $_POST["cat_id"]; $cat_id = (int) $_POST["cat_id"];
$auth_login = trim($_POST["auth_login"]); $auth_login = trim($_POST["auth_login"]);
$auth_pass = trim($_POST["auth_pass"]); $auth_pass = trim($_POST["auth_pass"]);
@ -986,48 +948,53 @@ class Pref_Feeds extends Handler_Protected {
$feed_language = trim($_POST["feed_language"]); $feed_language = trim($_POST["feed_language"]);
$auth_pass = $auth_pass;
if (get_pref('ENABLE_FEED_CATS')) {
if ($cat_id && $cat_id != 0) {
$category_qpart = "cat_id = '$cat_id',";
$category_qpart_nocomma = "cat_id = '$cat_id'";
} else {
$category_qpart = 'cat_id = NULL,';
$category_qpart_nocomma = 'cat_id = NULL';
}
} else {
$category_qpart = "";
$category_qpart_nocomma = "";
}
if (!$batch) { if (!$batch) {
if ($_POST["need_auth"] !== 'on') { if ($_POST["need_auth"] !== 'on') {
$auth_login = ''; $auth_login = '';
$auth_pass = ''; $auth_pass = '';
} }
$result = db_query("SELECT feed_url FROM ttrss_feeds WHERE id = " . $feed_id); $sth = $this->pdo->prepare("SELECT feed_url FROM ttrss_feeds WHERE id = ?");
$orig_feed_url = db_fetch_result($result, 0, "feed_url"); $sth->execute([$feed_id]);
$row = $sth->fetch();
$orig_feed_url = $row["feed_url"];
$reset_basic_info = $orig_feed_url != $feed_link; $reset_basic_info = $orig_feed_url != $feed_url;
db_query("UPDATE ttrss_feeds SET $sth = $this->pdo->prepare("UPDATE ttrss_feeds SET
$category_qpart cat_id = :cat_id,
title = '$feed_title', feed_url = '$feed_link', title = :title,
update_interval = '$upd_intl', feed_url = :feed_url,
purge_interval = '$purge_intl', update_interval = :upd_intl,
auth_login = '$auth_login', purge_interval = :purge_intl,
auth_pass = '$auth_pass', auth_login = :auth_login,
auth_pass = :auth_pass,
auth_pass_encrypted = false, auth_pass_encrypted = false,
private = $private, private = :private,
cache_images = $cache_images, cache_images = :cache_images,
hide_images = $hide_images, hide_images = :hide_images,
include_in_digest = $include_in_digest, include_in_digest = :include_in_digest,
always_display_enclosures = $always_display_enclosures, always_display_enclosures = :always_display_enclosures,
mark_unread_on_update = $mark_unread_on_update, mark_unread_on_update = :mark_unread_on_update,
feed_language = '$feed_language' feed_language = :feed_language
WHERE id = '$feed_id' AND owner_uid = " . $_SESSION["uid"]); WHERE id = :id AND owner_uid = :uid");
$sth->execute([":title" => $feed_title,
":cat_id" => $cat_id ? $cat_id : null,
":feed_url" => $feed_url,
":upd_intl" => $upd_intl,
":purge_intl" => $purge_intl,
":auth_login" => $auth_login,
":auth_pass" => $auth_pass,
":private" => (int)$private,
":cache_images" => (int)$cache_images,
":hide_images" => (int)$hide_images,
":include_in_digest" => (int)$include_in_digest,
":always_display_enclosures" => (int)$always_display_enclosures,
":mark_unread_on_update" => (int)$mark_unread_on_update,
":feed_language" => $feed_language,
":id" => $feed_id,
":uid" => $_SESSION['uid']]);
if ($reset_basic_info) { if ($reset_basic_info) {
RSSUtils::set_basic_feed_info($feed_id); RSSUtils::set_basic_feed_info($feed_id);
@ -1045,7 +1012,9 @@ class Pref_Feeds extends Handler_Protected {
} }
} }
db_query("BEGIN"); $this->pdo->beginTransaction();
$feed_ids_qmarks = arr_qmarks($feed_ids);
foreach (array_keys($feed_data) as $k) { foreach (array_keys($feed_data) as $k) {
@ -1053,72 +1022,80 @@ class Pref_Feeds extends Handler_Protected {
switch ($k) { switch ($k) {
case "title": case "title":
$qpart = "title = '$feed_title'"; $qpart = "title = " . $this->pdo->quote($feed_title);
break; break;
case "feed_url": case "feed_url":
$qpart = "feed_url = '$feed_link'"; $qpart = "feed_url = " . $this->pdo->quote($feed_url);
break; break;
case "update_interval": case "update_interval":
$qpart = "update_interval = '$upd_intl'"; $qpart = "update_interval = " . $this->pdo->quote($upd_intl);
break; break;
case "purge_interval": case "purge_interval":
$qpart = "purge_interval = '$purge_intl'"; $qpart = "purge_interval =" . $this->pdo->quote($purge_intl);
break; break;
case "auth_login": case "auth_login":
$qpart = "auth_login = '$auth_login'"; $qpart = "auth_login = " . $this->pdo->quote($auth_login);
break; break;
case "auth_pass": case "auth_pass":
$qpart = "auth_pass = '$auth_pass', auth_pass_encrypted = false"; $qpart = "auth_pass =" . $this->pdo->quote($auth_pass). ", auth_pass_encrypted = false";
break; break;
case "private": case "private":
$qpart = "private = $private"; $qpart = "private = " . $this->pdo->quote($private);
break; break;
case "include_in_digest": case "include_in_digest":
$qpart = "include_in_digest = $include_in_digest"; $qpart = "include_in_digest = " . $this->pdo->quote($include_in_digest);
break; break;
case "always_display_enclosures": case "always_display_enclosures":
$qpart = "always_display_enclosures = $always_display_enclosures"; $qpart = "always_display_enclosures = " . $this->pdo->quote($always_display_enclosures);
break; break;
case "mark_unread_on_update": case "mark_unread_on_update":
$qpart = "mark_unread_on_update = $mark_unread_on_update"; $qpart = "mark_unread_on_update = " . $this->pdo->quote($mark_unread_on_update);
break; break;
case "cache_images": case "cache_images":
$qpart = "cache_images = $cache_images"; $qpart = "cache_images = " . $this->pdo->quote($cache_images);
break; break;
case "hide_images": case "hide_images":
$qpart = "hide_images = $hide_images"; $qpart = "hide_images = " . $this->pdo->quote($hide_images);
break; break;
case "cat_id": case "cat_id":
$qpart = $category_qpart_nocomma; if (get_pref('ENABLE_FEED_CATS')) {
if ($cat_id) {
$qpart = "cat_id = " . $this->pdo->quote($cat_id);
} else {
$qpart = 'cat_id = NULL';
}
} else {
$qpart = "";
}
break; break;
case "feed_language": case "feed_language":
$qpart = "feed_language = '$feed_language'"; $qpart = "feed_language = " . $this->pdo->quote($feed_language);
break; break;
} }
if ($qpart) { if ($qpart) {
db_query( $sth = $this->pdo->prepare("UPDATE ttrss_feeds SET $qpart WHERE id IN ($feed_ids_qmarks)
"UPDATE ttrss_feeds SET $qpart WHERE id IN ($feed_ids) AND owner_uid = ?");
AND owner_uid = " . $_SESSION["uid"]); $sth->execute(array_merge($feed_ids, [$_SESSION['uid']]));
print "<br/>";
} }
} }
db_query("COMMIT"); $this->pdo->commit();
} }
return; return;
} }