X-Git-Url: https://git.wh0rd.org/?a=blobdiff_plain;f=functions.php;h=7fc5aa7ea41d2fe0b1051e15fbdfb79bdd7a93d3;hb=c90a028cdc9548a4ef1f6359b53b2c9d96c3a7a8;hp=161335c96536d128dc596235f7b96d9b3ca36428;hpb=3809b27874608388ec145d76b6da28b1e7eadab1;p=tt-rss.git diff --git a/functions.php b/functions.php index 161335c9..7fc5aa7e 100644 --- a/functions.php +++ b/functions.php @@ -1,10 +1,8 @@ connect(MEMCACHE_SERVER, 11211); + } + require_once 'db-prefs.php'; require_once 'compat.php'; require_once 'errors.php'; @@ -350,33 +353,31 @@ } } - function fetch_file_contents($url) { + function fetch_file_contents($url, $type) { if (USE_CURL_FOR_ICONS) { - $tmpfile = tempnam(TMP_DIRECTORY, "ttrss-tmp"); - $ch = curl_init($url); - $fp = fopen($tmpfile, "w"); - if ($fp) { - curl_setopt($ch, CURLOPT_FILE, $fp); - curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 15); - curl_setopt($ch, CURLOPT_TIMEOUT, 45); - curl_exec($ch); - - if (strpos(curl_getinfo($ch, CURLINFO_CONTENT_TYPE), "image/") !== false) { - curl_close($ch); - fclose($fp); - $contents = file_get_contents($tmpfile); - } else { - curl_close($ch); - fclose($fp); - } + curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 15); + curl_setopt($ch, CURLOPT_TIMEOUT, 45); + curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); + curl_setopt($ch, CURLOPT_MAXREDIRS, 20); + curl_setopt($ch, CURLOPT_BINARYTRANSFER, true); + curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); + + $contents = curl_exec($ch); + if ($contents === false) { + curl_close($ch); + return false; } - unlink($tmpfile); + $content_type = curl_getinfo($ch, CURLINFO_CONTENT_TYPE); + curl_close($ch); - return $contents; + if ($type && strpos($content_type, "$type") === false) { + return false; + } + return $contents; } else { return file_get_contents($url); } @@ -488,14 +489,16 @@ $icon_file = ICONS_DIR . "/$feed.ico"; if ($favicon_url && !file_exists($icon_file)) { - $contents = fetch_file_contents($favicon_url); + $contents = fetch_file_contents($favicon_url, "image"); - $fp = fopen($icon_file, "w"); + if ($contents) { + $fp = fopen($icon_file, "w"); - if ($fp) { - fwrite($fp, $contents); - fclose($fp); - chmod($icon_file, 0644); + if ($fp) { + fwrite($fp, $contents); + fclose($fp); + chmod($icon_file, 0644); + } } } @@ -503,7 +506,28 @@ } - function update_rss_feed($link, $feed_url, $feed, $ignore_daemon = false) { + function update_rss_feed($link, $feed, $ignore_daemon = false) { + + global $memcache; + + /* Update all feeds with the same URL to utilize memcache */ + + if ($memcache) { + $result = db_query($link, "SELECT f1.id + FROM ttrss_feeds AS f1, ttrss_feeds AS f2 + WHERE f2.feed_url = f1.feed_url AND f2.id = '$feed'"); + + while ($line = db_fetch_assoc($result)) { + update_rss_feed_real($link, $line["id"], $ignore_daemon); + } + } else { + update_rss_feed_real($link, $feed, $ignore_daemon); + } + } + + function update_rss_feed_real($link, $feed, $ignore_daemon = false) { + + global $memcache; if (!$_REQUEST["daemon"] && !$ignore_daemon) { return false; @@ -528,14 +552,14 @@ } else { $result = db_query($link, "SELECT id,update_interval,auth_login, - auth_pass,cache_images,update_method,last_updated + feed_url,auth_pass,cache_images,update_method,last_updated FROM ttrss_feeds WHERE id = '$feed'"); } if (db_num_rows($result) == 0) { if (defined('DAEMON_EXTENDED_DEBUG') || $_REQUEST['xdebug']) { - _debug("update_rss_feed: feed $feed [$feed_url] NOT FOUND/SKIPPED"); + _debug("update_rss_feed: feed $feed NOT FOUND/SKIPPED"); } return false; } @@ -549,14 +573,10 @@ $auth_login = db_fetch_result($result, 0, "auth_login"); $auth_pass = db_fetch_result($result, 0, "auth_pass"); - if (ALLOW_SELECT_UPDATE_METHOD) { - if (ENABLE_SIMPLEPIE) { - $use_simplepie = $update_method != 1; - } else { - $use_simplepie = $update_method == 2; - } + if (DEFAULT_UPDATE_METHOD == "1") { + $use_simplepie = $update_method != 1; } else { - $use_simplepie = ENABLE_SIMPLEPIE; + $use_simplepie = $update_method == 2; } if (defined('DAEMON_EXTENDED_DEBUG') || $_REQUEST['xdebug']) { @@ -570,13 +590,12 @@ $update_interval = db_fetch_result($result, 0, "update_interval"); $cache_images = sql_bool_to_bool(db_fetch_result($result, 0, "cache_images")); + $fetch_url = db_fetch_result($result, 0, "feed_url"); if ($update_interval < 0) { return; } $feed = db_escape_string($feed); - $fetch_url = $feed_url; - if ($auth_login && $auth_pass) { $url_parts = array(); preg_match("/(^[^:]*):\/\/(.*)/", $fetch_url, $url_parts); @@ -595,38 +614,53 @@ error_reporting(0); } - if (!$use_simplepie) { - $rss = fetch_rss($fetch_url); - } else { - if (!is_dir(SIMPLEPIE_CACHE_DIR)) { - mkdir(SIMPLEPIE_CACHE_DIR); - } - - $rss = new SimplePie(); - $rss->set_useragent(SIMPLEPIE_USERAGENT . MAGPIE_USER_AGENT_EXT); -# $rss->set_timeout(10); - $rss->set_feed_url($fetch_url); - $rss->set_output_encoding('UTF-8'); - - if (SIMPLEPIE_CACHE_IMAGES && $cache_images) { - if (defined('DAEMON_EXTENDED_DEBUG') || $_REQUEST['xdebug']) { - _debug("enabling image cache"); - } + $obj_id = md5("FDATA:$use_simplepie:$fetch_url"); - $rss->set_image_handler('./image.php', 'i'); - } + if ($memcache && $obj = $memcache->get($obj_id)) { if (defined('DAEMON_EXTENDED_DEBUG') || $_REQUEST['xdebug']) { - _debug("feed update interval (sec): " . - get_feed_update_interval($link, $feed)*60); + _debug("update_rss_feed: data found in memcache."); } - if (is_dir(SIMPLEPIE_CACHE_DIR)) { - $rss->set_cache_location(SIMPLEPIE_CACHE_DIR); - $rss->set_cache_duration(get_feed_update_interval($link, $feed) * 60); + $rss = $obj; + + } else { + + if (!$use_simplepie) { + $rss = fetch_rss($fetch_url); + } else { + if (!is_dir(SIMPLEPIE_CACHE_DIR)) { + mkdir(SIMPLEPIE_CACHE_DIR); + } + + $rss = new SimplePie(); + $rss->set_useragent(SIMPLEPIE_USERAGENT . MAGPIE_USER_AGENT_EXT); + # $rss->set_timeout(10); + $rss->set_feed_url($fetch_url); + $rss->set_output_encoding('UTF-8'); + + if (SIMPLEPIE_CACHE_IMAGES && $cache_images) { + if (defined('DAEMON_EXTENDED_DEBUG') || $_REQUEST['xdebug']) { + _debug("enabling image cache"); + } + + $rss->set_image_handler('./image.php', 'i'); + } + + if (defined('DAEMON_EXTENDED_DEBUG') || $_REQUEST['xdebug']) { + _debug("feed update interval (sec): " . + get_feed_update_interval($link, $feed)*60); + } + + if (is_dir(SIMPLEPIE_CACHE_DIR)) { + $rss->set_cache_location(SIMPLEPIE_CACHE_DIR); + $rss->set_cache_duration(get_feed_update_interval($link, $feed) * 60); + } + + $rss->init(); } - $rss->init(); + if ($memcache && $rss) $memcache->add($obj_id, $rss, 0, 300); } // print_r($rss); @@ -786,10 +820,11 @@ $rss_1_date = $item['dc']['date']; $atom_date = $item['issued']; if (!$atom_date) $atom_date = $item['updated']; - + if ($atom_date != "") $entry_timestamp = parse_w3cdtf($atom_date); if ($rss_1_date != "") $entry_timestamp = parse_w3cdtf($rss_1_date); if ($rss_2_date != "") $entry_timestamp = strtotime($rss_2_date); + } if ($entry_timestamp == "" || $entry_timestamp == -1 || !$entry_timestamp) { @@ -1141,7 +1176,7 @@ // error_reporting(0); $article_filters = get_article_filters($filters, $entry_title, - $entry_content, $entry_link, $entry_timestamp); + $entry_content, $entry_link, $entry_timestamp, $entry_author); if (defined('DAEMON_EXTENDED_DEBUG') || $_REQUEST['xdebug']) { _debug("update_rss_feed: article filters: "); @@ -1331,15 +1366,15 @@ # check for manual tags - $tag_filter = find_article_filter($article_filters, "tag"); + foreach ($article_filters as $f) { + if ($f[0] == "tag") { - if ($tag_filter) { + $manual_tags = trim_array(split(",", $f[1])); - $manual_tags = trim_array(split(",", $tag_filter[1])); - - foreach ($manual_tags as $tag) { - if (tag_is_valid($tag)) { - array_push($entry_tags, $tag); + foreach ($manual_tags as $tag) { + if (tag_is_valid($tag)) { + array_push($entry_tags, $tag); + } } } } @@ -1465,7 +1500,7 @@ print ""; } - function get_article_filters($filters, $title, $content, $link, $timestamp) { + function get_article_filters($filters, $title, $content, $link, $timestamp, $author) { $matches = array(); if ($filters["title"]) { @@ -1550,6 +1585,18 @@ } } + if ($filters["author"]) { + foreach ($filters["author"] as $filter) { + $reg_exp = $filter["reg_exp"]; + $inverse = $filter["inverse"]; + if ((!$inverse && preg_match("/$reg_exp/i", $author)) || + ($inverse && !preg_match("/$reg_exp/i", $author))) { + + array_push($matches, array($filter["action"], $filter["action_param"])); + } + } + } + return $matches; } @@ -1617,8 +1664,8 @@ $link_title = "Updated: $last_updated"; } - $feed = "$feed_title"; + $feed = "$feed_title"; /* if ($feed_id < -10) { $bg_color = "#00ccff"; @@ -2007,7 +2054,7 @@ function get_user_theme($link) { - if (get_schema_version($link) >= 63) { + if (get_schema_version($link) >= 63 && $_SESSION["uid"]) { $theme_name = get_pref($link, "_THEME_ID"); if (is_dir("themes/$theme_name")) { return $theme_name; @@ -2022,7 +2069,7 @@ function get_user_theme_path($link) { - if (get_schema_version($link) >= 63) { + if (get_schema_version($link) >= 63 && $_SESSION["uid"]) { $theme_name = get_pref($link, "_THEME_ID"); if ($theme_name && is_dir("themes/$theme_name")) { @@ -2195,7 +2242,10 @@ function make_lockfile($filename) { $fp = fopen(LOCK_DIRECTORY . "/$filename", "w"); - if (flock($fp, LOCK_EX | LOCK_NB)) { + if (flock($fp, LOCK_EX | LOCK_NB)) { + if (function_exists('posix_getpid')) { + fwrite($fp, posix_getpid() . "\n"); + } return $fp; } else { return false; @@ -2390,20 +2440,16 @@ $cat_qpart = "cat_id IS NULL"; } - $tmp_result = db_query($link, "SELECT id,feed_url FROM ttrss_feeds + $tmp_result = db_query($link, "SELECT id FROM ttrss_feeds WHERE $cat_qpart AND owner_uid = " . $_SESSION["uid"]); while ($tmp_line = db_fetch_assoc($tmp_result)) { - $feed_url = $tmp_line["feed_url"]; $feed_id = $tmp_line["id"]; - update_rss_feed($link, $feed_url, $feed_id, $force_update); + update_rss_feed($link, $feed_id, $force_update); } } else { - $tmp_result = db_query($link, "SELECT feed_url FROM ttrss_feeds - WHERE id = '$feed'"); - $feed_url = db_fetch_result($tmp_result, 0, "feed_url"); - update_rss_feed($link, $feed_url, $feed, $force_update); + update_rss_feed($link, $feed, $force_update); } } @@ -2923,7 +2969,7 @@ $feed_id = db_fetch_result($result, 0, "id"); if ($feed_id) { - update_rss_feed($link, $url, $feed_id, true); + update_rss_feed($link, $feed_id, true); } return 1; @@ -3246,8 +3292,15 @@ if ($match_on == "both") { foreach ($keywords as $k) { - array_push($query_keywords, "(UPPER(ttrss_entries.title) LIKE UPPER('%$k%') - OR UPPER(ttrss_entries.content) LIKE UPPER('%$k%'))"); + if (strpos($k, "-") === 0) { + $k = substr($k, 1); + $not = "NOT"; + } else { + $not = ""; + } + + array_push($query_keywords, "(UPPER(ttrss_entries.title) $not LIKE UPPER('%$k%') + OR UPPER(ttrss_entries.content) $not LIKE UPPER('%$k%'))"); } $search_query_part = implode("AND", $query_keywords) . " AND "; @@ -3255,7 +3308,14 @@ } else if ($match_on == "title") { foreach ($keywords as $k) { - array_push($query_keywords, "(UPPER(ttrss_entries.title) LIKE UPPER('%$k%'))"); + if (strpos($k, "-") === 0) { + $k = substr($k, 1); + $not = "NOT"; + } else { + $not = ""; + } + + array_push($query_keywords, "(UPPER(ttrss_entries.title) $not LIKE UPPER('%$k%'))"); } $search_query_part = implode("AND", $query_keywords) . " AND "; @@ -3263,7 +3323,14 @@ } else if ($match_on == "content") { foreach ($keywords as $k) { - array_push($query_keywords, "(UPPER(ttrss_entries.content) LIKE UPPER('%$k%'))"); + if (strpos($k, "-") === 0) { + $k = substr($k, 1); + $not = "NOT"; + } else { + $not = ""; + } + + array_push($query_keywords, "(UPPER(ttrss_entries.content) $not LIKE UPPER('%$k%'))"); } } @@ -3600,7 +3667,11 @@ $rfc822_date = date('r', strtotime($line["updated"])); - print "$rfc822_date"; + print "$rfc822_date"; + + if ($line["author"]) { + print "" . htmlspecialchars($line["author"]) . ""; + } print "" . htmlspecialchars($line["title"]) . ""; @@ -3694,7 +3765,7 @@ $res = preg_replace('/]+>/is', '', $res); } - if (get_pref($link, 'OPEN_LINKS_IN_NEW_WINDOW')) { + if (get_pref($link, 'OPEN_LINKS_IN_NEW_WINDOW', $owner)) { $res = preg_replace("/href=/i", "target=\"_blank\" href=", $res); } @@ -3890,7 +3961,7 @@ } error_reporting(0); - if (ENABLE_SIMPLEPIE) { + if (DEFAULT_UPDATE_INTERVAL == "1") { $rss = new SimplePie(); $rss->set_useragent(SIMPLEPIE_USERAGENT . MAGPIE_USER_AGENT_EXT); // $rss->set_timeout(MAGPIE_FETCH_TIME_OUT); @@ -3904,7 +3975,7 @@ if ($rss) { - if (ENABLE_SIMPLEPIE) { + if (DEFAULT_UPDATE_METHOD == "1") { $items = $rss->get_items(); } else { $items = $rss->items; @@ -3919,7 +3990,7 @@ $latest_item = $items[0]; - if (ENABLE_SIMPLEPIE) { + if (DEFAULT_UPDATE_METHOD == "1") { $last_title = $latest_item->get_title(); } else { $last_title = $latest_item["title"]; @@ -3927,7 +3998,7 @@ $latest_version = trim(preg_replace("/(Milestone)|(completed)/", "", $last_title)); - if (ENABLE_SIMPLEPIE) { + if (DEFAULT_UPDATE_METHOD == "1") { $release_url = sanitize_rss($link, $latest_item->get_link()); $content = sanitize_rss($link, $latest_item->get_description()); } else { @@ -3997,6 +4068,7 @@ function catchupArticlesById($link, $ids, $cmode, $owner_uid = false) { if (!$owner_uid) $owner_uid = $_SESSION["uid"]; + if (count($ids) == 0) return; $tmp_ids = array(); @@ -4491,19 +4563,30 @@ function get_article_tags($link, $id, $owner_uid = 0) { + global $memcache; + $a_id = db_escape_string($id); if (!$owner_uid) $owner_uid = $_SESSION["uid"]; - $tmp_result = db_query($link, "SELECT DISTINCT tag_name, + $query = "SELECT DISTINCT tag_name, owner_uid as owner FROM ttrss_tags WHERE post_int_id = (SELECT int_id FROM ttrss_user_entries WHERE - ref_id = '$a_id' AND owner_uid = '$owner_uid' LIMIT 1) ORDER BY tag_name"); + ref_id = '$a_id' AND owner_uid = '$owner_uid' LIMIT 1) ORDER BY tag_name"; + $obj_id = md5("TAGS:$owner_uid:$id"); $tags = array(); - - while ($tmp_line = db_fetch_assoc($tmp_result)) { - array_push($tags, $tmp_line["tag_name"]); + + if ($memcache && $obj = $memcache->get($obj_id)) { + $tags = $obj; + } else { + $tmp_result = db_query($link, $query); + + while ($tmp_line = db_fetch_assoc($tmp_result)) { + array_push($tags, $tmp_line["tag_name"]); + } + + if ($memcache) $memcache->add($obj_id, $tags, 0, 3600); } return $tags; @@ -4811,15 +4894,20 @@ print $article_content; - $result = db_query($link, "SELECT * FROM ttrss_enclosures WHERE - post_id = '$id' AND content_url != ''"); +// $result = db_query($link, "SELECT * FROM ttrss_enclosures WHERE +// post_id = '$id' AND content_url != ''"); - if (db_num_rows($result) > 0) { + $result = get_article_enclosures($link, $id); + +// if (db_num_rows($result) > 0) { + + if (count($result) > 0) { $entries_html = array(); $entries = array(); - while ($line = db_fetch_assoc($result)) { + //while ($line = db_fetch_assoc($result)) { + foreach ($result as $line) { $url = $line["content_url"]; $ctype = $line["content_type"]; @@ -4847,19 +4935,22 @@ print "
"; if (!get_pref($link, "STRIP_IMAGES")) { - if ($always_display_enclosures || !preg_match("/\"".htmlspecialchars($entry["filename"])."\"

"; + src=\"" .htmlspecialchars($entry["url"]) . "\"/>

"; } } } } - print "
"; - if (db_num_rows($result) == 1) { print __("Attachment:") . " "; } else { @@ -5428,9 +5519,12 @@ $always_display_enclosures = db_fetch_result($tmp_result, 0, "always_display_enclosures"); if (!get_pref($link, "STRIP_IMAGES")) { - if ($always_display_enclosures || !preg_match("/img/i", $article_content)) { + if ($always_display_enclosures || + !preg_match("/img/i", $article_content)) { + foreach ($entries as $entry) { - if (preg_match("/image/", $entry["type"])) { + if (preg_match("/image/", $entry["type"]) || + preg_match("/\.(jpg|png|gif|bmp)/i", $entry["filename"])) { print "

\"".htmlspecialchars($entry["filename"])."\"

"; @@ -5639,6 +5733,22 @@ return $url_path; } + function opml_publish_url($link){ + $url_path = ""; + + + if ($_SERVER['HTTPS'] != "on") { + $url_path = "http://"; + } else { + $url_path = "https://"; + } + + $url_path .= $_SERVER['HTTP_HOST'].dirname($_SERVER['PHP_SELF']); + $url_path .= "/opml.php?op=publish&key=" . + get_pref($link, "_PREFS_PUBLISH_KEY", $_SESSION["uid"]); + + return $url_path; + } /** * Purge a feed contents, marked articles excepted. @@ -5785,13 +5895,6 @@ if($debug) _debug("Feed: " . $line["feed_url"] . ", " . $line["last_updated"]); - // We setup a alarm to alert if the feed take more than 300s to update. - // => HANG alarm. - if(!$from_http && function_exists('pcntl_alarm')) pcntl_alarm(300); - update_rss_feed($link, $line["feed_url"], $line["id"], true); - // Cancel the alarm (the update went well) - if(!$from_http && function_exists('pcntl_alarm')) pcntl_alarm(0); - sleep(1); // prevent flood (FIXME make this an option?) } @@ -5812,34 +5915,47 @@ function load_filters($link, $feed, $owner_uid, $action_id = false) { $filters = array(); - if ($action_id) $ftype_query_part = "action_id = '$action_id' AND"; - - $result = db_query($link, "SELECT reg_exp, - ttrss_filter_types.name AS name, - ttrss_filter_actions.name AS action, - inverse, - action_param, - filter_param - FROM ttrss_filters,ttrss_filter_types,ttrss_filter_actions WHERE - enabled = true AND - $ftype_query_part - owner_uid = $owner_uid AND - ttrss_filter_types.id = filter_type AND - ttrss_filter_actions.id = action_id AND - (feed_id IS NULL OR feed_id = '$feed') ORDER BY reg_exp"); + global $memcache; - while ($line = db_fetch_assoc($result)) { - if (!$filters[$line["name"]]) $filters[$line["name"]] = array(); - $filter["reg_exp"] = $line["reg_exp"]; - $filter["action"] = $line["action"]; - $filter["action_param"] = $line["action_param"]; - $filter["filter_param"] = $line["filter_param"]; - $filter["inverse"] = sql_bool_to_bool($line["inverse"]); - - array_push($filters[$line["name"]], $filter); - } + $obj_id = md5("FILTER:$feed:$owner_uid:$action_id"); - return $filters; + if ($memcache && $obj = $memcache->get($obj_id)) { + + return $obj; + + } else { + + if ($action_id) $ftype_query_part = "action_id = '$action_id' AND"; + + $result = db_query($link, "SELECT reg_exp, + ttrss_filter_types.name AS name, + ttrss_filter_actions.name AS action, + inverse, + action_param, + filter_param + FROM ttrss_filters,ttrss_filter_types,ttrss_filter_actions WHERE + enabled = true AND + $ftype_query_part + owner_uid = $owner_uid AND + ttrss_filter_types.id = filter_type AND + ttrss_filter_actions.id = action_id AND + (feed_id IS NULL OR feed_id = '$feed') ORDER BY reg_exp"); + + while ($line = db_fetch_assoc($result)) { + if (!$filters[$line["name"]]) $filters[$line["name"]] = array(); + $filter["reg_exp"] = $line["reg_exp"]; + $filter["action"] = $line["action"]; + $filter["action_param"] = $line["action_param"]; + $filter["filter_param"] = $line["filter_param"]; + $filter["inverse"] = sql_bool_to_bool($line["inverse"]); + + array_push($filters[$line["name"]], $filter); + } + + if ($memcache) $memcache->add($obj_id, $filters, 0, 3600*8); + + return $filters; + } } function get_score_pic($score) { @@ -6127,6 +6243,8 @@ } function get_article_labels($link, $id) { + global $memcache; + $result = db_query($link, "SELECT DISTINCT label_id,caption,fg_color,bg_color FROM ttrss_labels2, ttrss_user_labels2 @@ -6135,12 +6253,19 @@ AND owner_uid = ".$_SESSION["uid"] . " ORDER BY caption"); + $obj_id = md5("LABELS:$id:" . $_SESSION["uid"]); + $rv = array(); - while ($line = db_fetch_assoc($result)) { - $rk = array($line["label_id"], $line["caption"], $line["fg_color"], - $line["bg_color"]); - array_push($rv, $rk); + if ($memcache && $obj = $memcache->get($obj_id)) { + return $obj; + } else { + while ($line = db_fetch_assoc($result)) { + $rk = array($line["label_id"], $line["caption"], $line["fg_color"], + $line["bg_color"]); + array_push($rv, $rk); + } + if ($memcache) $memcache->add($obj_id, $rv, 0, 3600); } return $rv; @@ -6174,6 +6299,13 @@ function label_add_article($link, $id, $label, $owner_uid) { + global $memcache; + + if ($memcache) { + $obj_id = md5("LABELS:$id:$owner_uid"); + $memcache->delete($obj_id); + } + $label_id = label_find_id($link, $label, $owner_uid); if (!$label_id) return; @@ -6194,6 +6326,12 @@ } function label_remove($link, $id, $owner_uid) { + global $memcache; + + if ($memcache) { + $obj_id = md5("LABELS:$id:$owner_uid"); + $memcache->delete($obj_id); + } db_query($link, "BEGIN"); @@ -6483,4 +6621,31 @@ } + function get_article_enclosures($link, $id) { + + global $memcache; + + $query = "SELECT * FROM ttrss_enclosures + WHERE post_id = '$id' AND content_url != ''"; + + $obj_id = md5("ENCLOSURES:$id"); + + $rv = array(); + + if ($memcache && $obj = $memcache->get($obj_id)) { + $rv = $obj; + } else { + $result = db_query($link, $query); + + if (db_num_rows($result) > 0) { + while ($line = db_fetch_assoc($result)) { + array_push($rv, $line); + } + if ($memcache) $memcache->add($obj_id, $rv, 0, 3600); + } + } + + return $rv; + } + ?>