X-Git-Url: https://git.wh0rd.org/?a=blobdiff_plain;f=functions.php;h=885505c922545e8023d4d07fcb7e6eb751772a1c;hb=52c61bf8666e83f6be708b343e957ba6fb54933b;hp=536f5d66dc8cf5a02c898c9bd1586099aa4b2e13;hpb=7d7cbaf5f84980d3089060630159ba7877bfe35f;p=tt-rss.git diff --git a/functions.php b/functions.php index 536f5d66..885505c9 100644 --- a/functions.php +++ b/functions.php @@ -1,38 +1,93 @@ "; +// print "Feed $feed_id: purge interval = $purge_interval\n"; } if ($purge_interval > 0) { - purge_feed($link, $feed_id, $purge_interval); + purge_feed($link, $feed_id, $purge_interval, $do_output); } } @@ -101,10 +156,22 @@ // db_query($link, "BEGIN"); + if (MAX_UPDATE_TIME > 0) { + if (DB_TYPE == "mysql") { + $q_order = "RAND()"; + } else { + $q_order = "RANDOM()"; + } + } else { + $q_order = "last_updated DESC"; + } + $result = db_query($link, "SELECT feed_url,id, SUBSTRING(last_updated,1,19) AS last_updated, update_interval FROM ttrss_feeds WHERE owner_uid = '$user_id' - ORDER BY last_updated DESC"); + ORDER BY $q_order"); + + $upd_start = time(); while ($line = db_fetch_assoc($result)) { $upd_intl = $line["update_interval"]; @@ -113,10 +180,23 @@ $upd_intl = get_pref($link, 'DEFAULT_UPDATE_INTERVAL', $user_id); } + if ($upd_intl < 0) { + // Updates for this feed are disabled + continue; + } + if ($fetch || (!$line["last_updated"] || time() - strtotime($line["last_updated"]) > ($upd_intl * 60))) { +// print ""; + update_rss_feed($link, $line["feed_url"], $line["id"], $force_daemon); + + $upd_elapsed = time() - $upd_start; + + if (MAX_UPDATE_TIME > 0 && $upd_elapsed > MAX_UPDATE_TIME) { + return; + } } } @@ -194,16 +274,34 @@ } } - error_reporting(0); - $rss = fetch_rss($fetch_url); - error_reporting (DEFAULT_ERROR_LEVEL); + if (RSS_BACKEND_TYPE == "magpie") { + error_reporting(0); + $rss = fetch_rss($fetch_url); + error_reporting (DEFAULT_ERROR_LEVEL); + } else if (RSS_BACKEND_TYPE == "simplepie") { + + if (!file_exists(SIMPLEPIE_CACHE_DIR)) { + mkdir(SIMPLEPIE_CACHE_DIR); + } + $rss = new SimplePie(); + $rss->feed_url($fetch_url); + $rss->cache_location(SIMPLEPIE_CACHE_DIR); + $rss->init(); + } + $feed = db_escape_string($feed); - if ($rss) { + $rss_check = $rss; - db_query($link, "BEGIN"); + if (RSS_BACKEND_TYPE == "simplepie") { + $rss_check = $rss->data; + } + + if ($rss_check) { + +// db_query($link, "BEGIN"); $result = db_query($link, "SELECT title,icon_url,site_url,owner_uid FROM ttrss_feeds WHERE id = '$feed'"); @@ -219,14 +317,24 @@ } if (!$registered_title || $registered_title == "[Unknown]") { - $feed_title = db_escape_string($rss->channel["title"]); + + if (RSS_BACKEND_TYPE == "magpie") { + $feed_title = db_escape_string($rss->channel["title"]); + } else { + $feed_title = $rss->get_feed_title(); + } + db_query($link, "UPDATE ttrss_feeds SET title = '$feed_title' WHERE id = '$feed'"); } - $site_url = $rss->channel["link"]; - // weird, weird Magpie - if (!$site_url) $site_url = db_escape_string($rss->channel["link_"]); + if (RSS_BACKEND_TYPE == "magpie") { + $site_url = $rss->channel["link"]; + // weird, weird Magpie + if (!$site_url) $site_url = db_escape_string($rss->channel["link_"]); + } else { + $site_url = $rss->get_feed_link(); + } if ($site_url && $orig_site_url != db_escape_string($site_url)) { db_query($link, "UPDATE ttrss_feeds SET @@ -235,7 +343,11 @@ // print "I: " . $rss->channel["image"]["url"]; - $icon_url = $rss->image["url"]; + if (RSS_BACKEND_TYPE == "magpie") { + $icon_url = $rss->image["url"]; + } else { + $icon_url = $rss->get_image_url(); # FIXME + } if ($icon_url && !$orig_icon_url != db_escape_string($icon_url)) { $icon_url = db_escape_string($icon_url); @@ -263,86 +375,162 @@ array_push($filters[$line["name"]], $filter); } - $iterator = $rss->items; + if (RSS_BACKEND_TYPE == "magpie") { + $iterator = $rss->items; - if (!$iterator) $iterator = $rss->entries; - if (!$iterator) $iterator = $rss; + if (!$iterator || !is_array($iterator)) $iterator = $rss->entries; + if (!$iterator || !is_array($iterator)) $iterator = $rss; - foreach ($iterator as $item) { - - $entry_guid = $item["id"]; - - if (!$entry_guid) $entry_guid = $item["guid"]; - if (!$entry_guid) $entry_guid = $item["link"]; + } else { + $iterator = $rss->get_items(); + } - if (!$entry_guid) continue; + if (!is_array($iterator)) { + /* db_query($link, "UPDATE ttrss_feeds + SET last_error = 'Parse error: can\'t find any articles.' + WHERE id = '$feed'"); */ + return; // WTF? + } - $entry_timestamp = ""; + foreach ($iterator as $item) { - $rss_2_date = $item['pubdate']; - $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 (RSS_BACKEND_TYPE == "magpie") { - if ($entry_timestamp == "") { - $entry_timestamp = time(); - $no_orig_date = 'true'; - } else { - $no_orig_date = 'false'; - } - - $entry_timestamp_fmt = strftime("%Y/%m/%d %H:%M:%S", $entry_timestamp); + $entry_guid = $item["id"]; + + if (!$entry_guid) $entry_guid = $item["guid"]; + if (!$entry_guid) $entry_guid = $item["link"]; + + if (!$entry_guid) continue; + + $entry_timestamp = ""; + + $rss_2_date = $item['pubdate']; + $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 = time(); + $no_orig_date = 'true'; + } else { + $no_orig_date = 'false'; + } + + $entry_timestamp_fmt = strftime("%Y/%m/%d %H:%M:%S", $entry_timestamp); + + $entry_title = $item["title"]; + + // strange Magpie workaround + $entry_link = $item["link_"]; + if (!$entry_link) $entry_link = $item["link"]; + + if (!$entry_title) continue; + if (!$entry_link) continue; + + $entry_content = $item["content:escaped"]; + + if (!$entry_content) $entry_content = $item["content:encoded"]; + if (!$entry_content) $entry_content = $item["content"]; + if (!$entry_content) $entry_content = $item["atom_content"]; + if (!$entry_content) $entry_content = $item["summary"]; + if (!$entry_content) $entry_content = $item["description"]; + + // if (!$entry_content) continue; + + // WTF + if (is_array($entry_content)) { + $entry_content = $entry_content["encoded"]; + if (!$entry_content) $entry_content = $entry_content["escaped"]; + } + + // print_r($item); + // print_r(htmlspecialchars($entry_content)); + // print "
"; + + $entry_content_unescaped = $entry_content; + $content_hash = "SHA1:" . sha1(strip_tags($entry_content)); + + $entry_comments = $item["comments"]; + + $entry_author = db_escape_string($item['dc']['creator']); + + $entry_guid = db_escape_string($entry_guid); + + $result = db_query($link, "SELECT id FROM ttrss_entries + WHERE guid = '$entry_guid'"); + + $entry_content = db_escape_string($entry_content); + $entry_title = db_escape_string($entry_title); + $entry_link = db_escape_string($entry_link); + $entry_comments = db_escape_string($entry_comments); + + $num_comments = db_escape_string($item["slash"]["comments"]); + + if (!$num_comments) $num_comments = 0; - $entry_title = $item["title"]; + } else if (RSS_BACKEND_TYPE == "simplepie") { - // strange Magpie workaround - $entry_link = $item["link_"]; - if (!$entry_link) $entry_link = $item["link"]; + $entry_guid = $item->get_id(); - if (!$entry_title) continue; - if (!$entry_link) continue; + if (!$entry_guid) { + $entry_guid = $item->get_permalink(); + } + + if (!$entry_guid) continue; + + $entry_timestamp = $item->get_date("U"); + + if ($entry_timestamp == "") { + $entry_timestamp = time(); + $no_orig_date = 'true'; + } else { + $no_orig_date = 'false'; + } + + $entry_timestamp_fmt = strftime("%Y/%m/%d %H:%M:%S", $entry_timestamp); + + $entry_title = $item->get_title(); + $entry_link = $item->get_permalink(); + + if (!$entry_title) continue; + if (!$entry_link) continue; - $entry_content = $item["content:escaped"]; + $entry_content = $item->get_description(); + +// print_r(htmlspecialchars($entry_content)); +// print "
"; + + $entry_content_unescaped = $entry_content; + $content_hash = "SHA1:" . sha1(strip_tags($entry_content)); + + $entry_comments = ""; # FIXME + + $entry_author = $item->get_author(0); - if (!$entry_content) $entry_content = $item["content:encoded"]; - if (!$entry_content) $entry_content = $item["content"]; - if (!$entry_content) $entry_content = $item["summary"]; - if (!$entry_content) $entry_content = $item["description"]; + $entry_author = db_escape_string($entry_author->name); + + $entry_guid = db_escape_string($entry_guid); -// if (!$entry_content) continue; + $result = db_query($link, "SELECT id FROM ttrss_entries + WHERE guid = '$entry_guid'"); + + $entry_content = db_escape_string($entry_content); + $entry_title = db_escape_string($entry_title); + $entry_link = db_escape_string($entry_link); + $entry_comments = db_escape_string($entry_comments); + + $num_comments = 0; # FIXME + + if (!$num_comments) $num_comments = 0; - // WTF - if (is_array($entry_content)) { - $entry_content = $entry_content["encoded"]; - if (!$entry_content) $entry_content = $entry_content["escaped"]; } -// print_r($item); -// print_r(htmlspecialchars($entry_content)); -// print "
"; - - $entry_content_unescaped = $entry_content; - $content_hash = "SHA1:" . sha1(strip_tags($entry_content)); - - $entry_comments = $item["comments"]; - - $entry_guid = db_escape_string($entry_guid); - - $result = db_query($link, "SELECT id FROM ttrss_entries - WHERE guid = '$entry_guid'"); - - $entry_content = db_escape_string($entry_content); - $entry_title = db_escape_string($entry_title); - $entry_link = db_escape_string($entry_link); - $entry_comments = db_escape_string($entry_comments); - - $num_comments = db_escape_string($item["slash"]["comments"]); - - if (!$num_comments) $num_comments = 0; + db_query($link, "BEGIN"); if (db_num_rows($result) == 0) { @@ -359,7 +547,8 @@ no_orig_date, date_entered, comments, - num_comments) + num_comments, + author) VALUES ('$entry_title', '$entry_guid', @@ -370,7 +559,8 @@ $no_orig_date, NOW(), '$entry_comments', - '$num_comments')"); + '$num_comments', + '$entry_author')"); } else { // we keep encountering the entry in feeds, so we need to // update date_entered column so that we don't get horrible @@ -440,12 +630,18 @@ $unread = 'false'; $last_read_qpart = 'NOW()'; } + + if ($filter_name == 'mark') { + $marked = 'true'; + } else { + $marked = 'false'; + } $result = db_query($link, "INSERT INTO ttrss_user_entries - (ref_id, owner_uid, feed_id, unread, last_read) + (ref_id, owner_uid, feed_id, unread, last_read, marked) VALUES ('$ref_id', '$owner_uid', '$feed', $unread, - $last_read_qpart)"); + $last_read_qpart, $marked)"); } $post_needs_update = false; @@ -480,12 +676,19 @@ num_comments = '$num_comments' WHERE id = '$ref_id'"); - db_query($link, "UPDATE ttrss_user_entries - SET last_read = null WHERE ref_id = '$ref_id' AND unread = false"); + if (get_pref($link, "MARK_UNREAD_ON_UPDATE")) { + db_query($link, "UPDATE ttrss_user_entries + SET last_read = null, unread = true WHERE ref_id = '$ref_id'"); + } else { + db_query($link, "UPDATE ttrss_user_entries + SET last_read = null WHERE ref_id = '$ref_id' AND unread = false"); + } } } + db_query($link, "COMMIT"); + /* taaaags */ // , // @@ -502,6 +705,8 @@ if (count($entry_tags) > 0) { + db_query($link, "BEGIN"); + $result = db_query($link, "SELECT id,int_id FROM ttrss_entries,ttrss_user_entries WHERE guid = '$entry_guid' @@ -535,13 +740,14 @@ } } } + db_query($link, "COMMIT"); } } db_query($link, "UPDATE ttrss_feeds SET last_updated = NOW(), last_error = '' WHERE id = '$feed'"); - db_query($link, "COMMIT"); +// db_query($link, "COMMIT"); } else { $error_msg = db_escape_string(magpie_error()); @@ -553,7 +759,7 @@ } function print_select($id, $default, $values, $attributes = "") { - print ""; foreach ($values as $v) { if ($v == $default) $sel = " selected"; @@ -565,6 +771,20 @@ print ""; } + function print_select_hash($id, $default, $values, $attributes = "") { + print ""; + } + function get_filter_name($title, $content, $link, $filters) { if ($filters["title"]) { @@ -608,7 +828,8 @@ return false; } - function printFeedEntry($feed_id, $class, $feed_title, $unread, $icon_file, $link) { + function printFeedEntry($feed_id, $class, $feed_title, $unread, $icon_file, $link, + $rtl_content = false, $last_updated = false, $last_error = false) { if (file_exists($icon_file) && filesize($icon_file) > 0) { $feed_icon = ""; @@ -616,14 +837,29 @@ $feed_icon = ""; } - $feed = "$feed_title"; + if ($rtl_content) { + $rtl_tag = "dir=\"rtl\""; + } else { + $rtl_tag = "dir=\"ltr\""; + } + + $error_notify_msg = ""; + + if ($last_error) { + $link_title = "Error: $last_error ($last_updated)"; + $error_notify_msg = "(Error)"; + } else if ($last_updated) { + $link_title = "Updated: $last_updated"; + } + + $feed = "$feed_title"; print "
  • "; if (get_pref($link, 'ENABLE_FEED_ICONS')) { print "$feed_icon"; } - print "$feed"; + print "$feed"; if ($unread != 0) { $fctr_class = ""; @@ -631,9 +867,14 @@ $fctr_class = "class=\"invisible\""; } - print " + print " ($unread)"; - + + if (get_pref($link, "EXTENDED_FEEDLIST")) { + print "
    + $last_updated $error_notify_msg
    "; + } + print "
  • "; } @@ -657,7 +898,8 @@ $sel .= " value=\"0\""; } - print " $v "; + print " $v "; } } @@ -693,34 +935,62 @@ db_query($link, "COMMIT"); } - - function authenticate_user($link, $login, $password) { - $pwd_hash = 'SHA1:' . sha1($password); + function lookup_user_id($link, $user) { - $result = db_query($link, "SELECT id,login,access_level FROM ttrss_users WHERE - login = '$login' AND ((pwd_hash = '$password' AND '$password' = 'password') - OR pwd_hash = '$pwd_hash')"); + $result = db_query($link, "SELECT id FROM ttrss_users WHERE + login = '$login'"); if (db_num_rows($result) == 1) { - $_SESSION["uid"] = db_fetch_result($result, 0, "id"); - $_SESSION["name"] = db_fetch_result($result, 0, "login"); - $_SESSION["access_level"] = db_fetch_result($result, 0, "access_level"); + return db_fetch_result($result, 0, "id"); + } else { + return false; + } + } - db_query($link, "UPDATE ttrss_users SET last_login = NOW() WHERE id = " . - $_SESSION["uid"]); + function authenticate_user($link, $login, $password) { - $user_theme = get_user_theme_path($link); + if (!SINGLE_USER_MODE) { - $_SESSION["theme"] = $user_theme; + $pwd_hash = 'SHA1:' . sha1($password); + + $result = db_query($link, "SELECT id,login,access_level FROM ttrss_users WHERE + login = '$login' AND pwd_hash = '$pwd_hash'"); + + if (db_num_rows($result) == 1) { + $_SESSION["uid"] = db_fetch_result($result, 0, "id"); + $_SESSION["name"] = db_fetch_result($result, 0, "login"); + $_SESSION["access_level"] = db_fetch_result($result, 0, "access_level"); + + db_query($link, "UPDATE ttrss_users SET last_login = NOW() WHERE id = " . + $_SESSION["uid"]); + + $user_theme = get_user_theme_path($link); + + $_SESSION["theme"] = $user_theme; + $_SESSION["ip_address"] = $_SERVER["REMOTE_ADDR"]; + + initialize_user_prefs($link, $_SESSION["uid"]); + + return true; + } + + return false; - initialize_user_prefs($link, $_SESSION["uid"]); + } else { + + $_SESSION["uid"] = 1; + $_SESSION["name"] = "admin"; + $user_theme = get_user_theme_path($link); + + $_SESSION["theme"] = $user_theme; + $_SESSION["ip_address"] = $_SERVER["REMOTE_ADDR"]; + + initialize_user_prefs($link, $_SESSION["uid"]); + return true; } - - return false; - } function make_password($length = 8) { @@ -761,7 +1031,10 @@ } function logout_user() { - session_destroy(); + session_destroy(); + if (isset($_COOKIE[session_name()])) { + setcookie(session_name(), '', time()-42000, '/'); + } } function get_script_urlpath() { @@ -784,9 +1057,39 @@ return $redirect_uri; } + function validate_session($link) { + if (SESSION_CHECK_ADDRESS && $_SESSION["uid"]) { + if ($_SESSION["ip_address"]) { + if ($_SESSION["ip_address"] != $_SERVER["REMOTE_ADDR"]) { + return false; + } + } + } + return true; + } + + function basic_nosid_redirect_check() { + if (!SINGLE_USER_MODE) { + if (!$_COOKIE[get_session_cookie_name()]) { + $redirect_uri = get_login_redirect(); + $return_to = preg_replace('/.*?\//', '', $_SERVER["REQUEST_URI"]); + header("Location: $redirect_uri?rt=$return_to"); + exit; + } + } + } + function login_sequence($link) { if (!SINGLE_USER_MODE) { + if (!validate_session($link)) { + logout_user(); + $redirect_uri = get_login_redirect(); + $return_to = preg_replace('/.*?\//', '', $_SERVER["REQUEST_URI"]); + header("Location: $redirect_uri?rt=$return_to"); + exit; + } + if (!USE_HTTP_AUTH) { if (!$_SESSION["uid"]) { $redirect_uri = get_login_redirect(); @@ -815,9 +1118,7 @@ } } } else { - $_SESSION["uid"] = 1; - $_SESSION["name"] = "admin"; - initialize_user_prefs($link, 1); + return authenticate_user($link, "admin", null); } } @@ -847,7 +1148,7 @@ } else if (date("Y", $timestamp) == date("Y")) { return date("M d, G:i", $timestamp); } else { - return date("Y/m/d G:i"); + return date("Y/m/d G:i", $timestamp); } } @@ -857,7 +1158,7 @@ } else if (date("Y", $timestamp) == date("Y")) { return date("D m", $timestamp); } else { - return date("Y/m/d"); + return date("Y/m/d", $timestamp); } } @@ -896,11 +1197,964 @@ } if ($error_code != 0) { - print ""; + print_error_xml(5); return false; } else { return true; } } + function file_is_locked($filename) { + error_reporting(0); + $fp = fopen($filename, "r"); + error_reporting(DEFAULT_ERROR_LEVEL); + if ($fp) { + if (flock($fp, LOCK_EX | LOCK_NB)) { + flock($fp, LOCK_UN); + fclose($fp); + return false; + } + fclose($fp); + return true; + } + return false; + } + + function make_lockfile($filename) { + $fp = fopen($filename, "w"); + + if (flock($fp, LOCK_EX | LOCK_NB)) { + return $fp; + } else { + return false; + } + } + + function sql_random_function() { + if (DB_TYPE == "mysql") { + return "RAND()"; + } else { + return "RANDOM()"; + } + } + + function catchup_feed($link, $feed, $cat_view) { + if (preg_match("/^[0-9][0-9]*$/", $feed) != false && $feed >= 0) { + + if ($cat_view) { + + if ($feed > 0) { + $cat_qpart = "cat_id = '$feed'"; + } else { + $cat_qpart = "cat_id IS NULL"; + } + + $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)) { + + $tmp_feed = $tmp_line["id"]; + + db_query($link, "UPDATE ttrss_user_entries + SET unread = false,last_read = NOW() + WHERE feed_id = '$tmp_feed' AND owner_uid = " . $_SESSION["uid"]); + } + + } else if ($feed > 0) { + + $tmp_result = db_query($link, "SELECT id + FROM ttrss_feeds WHERE parent_feed = '$feed' + ORDER BY cat_id,title"); + + $parent_ids = array(); + + if (db_num_rows($tmp_result) > 0) { + while ($p = db_fetch_assoc($tmp_result)) { + array_push($parent_ids, "feed_id = " . $p["id"]); + } + + $children_qpart = implode(" OR ", $parent_ids); + + db_query($link, "UPDATE ttrss_user_entries + SET unread = false,last_read = NOW() + WHERE (feed_id = '$feed' OR $children_qpart) + AND owner_uid = " . $_SESSION["uid"]); + + } else { + db_query($link, "UPDATE ttrss_user_entries + SET unread = false,last_read = NOW() + WHERE feed_id = '$feed' AND owner_uid = " . $_SESSION["uid"]); + } + + } else if ($feed < 0 && $feed > -10) { // special, like starred + + if ($feed == -1) { + db_query($link, "UPDATE ttrss_user_entries + SET unread = false,last_read = NOW() + WHERE marked = true AND owner_uid = ".$_SESSION["uid"]); + } + + } else if ($feed < -10) { // label + + // TODO make this more efficient + + $label_id = -$feed - 11; + + $tmp_result = db_query($link, "SELECT sql_exp FROM ttrss_labels + WHERE id = '$label_id'"); + + if ($tmp_result) { + $sql_exp = db_fetch_result($tmp_result, 0, "sql_exp"); + + db_query($link, "BEGIN"); + + $tmp2_result = db_query($link, + "SELECT + int_id + FROM + ttrss_user_entries,ttrss_entries + WHERE + ref_id = id AND + $sql_exp AND + owner_uid = " . $_SESSION["uid"]); + + while ($tmp_line = db_fetch_assoc($tmp2_result)) { + db_query($link, "UPDATE + ttrss_user_entries + SET + unread = false, last_read = NOW() + WHERE + int_id = " . $tmp_line["int_id"]); + } + + db_query($link, "COMMIT"); + +/* db_query($link, "UPDATE ttrss_user_entries,ttrss_entries + SET unread = false,last_read = NOW() + WHERE $sql_exp + AND ref_id = id + AND owner_uid = ".$_SESSION["uid"]); */ + } + } + } else { // tag + db_query($link, "BEGIN"); + + $tag_name = db_escape_string($feed); + + $result = db_query($link, "SELECT post_int_id FROM ttrss_tags + WHERE tag_name = '$tag_name' AND owner_uid = " . $_SESSION["uid"]); + + while ($line = db_fetch_assoc($result)) { + db_query($link, "UPDATE ttrss_user_entries SET + unread = false, last_read = NOW() + WHERE int_id = " . $line["post_int_id"]); + } + db_query($link, "COMMIT"); + } + } + + function update_generic_feed($link, $feed, $cat_view) { + if ($cat_view) { + + if ($feed > 0) { + $cat_qpart = "cat_id = '$feed'"; + } else { + $cat_qpart = "cat_id IS NULL"; + } + + $tmp_result = db_query($link, "SELECT feed_url 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"]; + update_rss_feed($link, $feed_url, $feed, ENABLE_UPDATE_DAEMON); + } + + } 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, ENABLE_UPDATE_DAEMON); + } + } + + function getAllCounters($link) { + getLabelCounters($link); + getFeedCounters($link); + getTagCounters($link); + getGlobalCounters($link); + if (get_pref($link, 'ENABLE_FEED_CATS')) { + getCategoryCounters($link); + } + } + + function getCategoryCounters($link) { + $result = db_query($link, "SELECT cat_id,SUM((SELECT COUNT(int_id) + FROM ttrss_user_entries WHERE feed_id = ttrss_feeds.id + AND unread = true)) AS unread FROM ttrss_feeds + WHERE + owner_uid = ".$_SESSION["uid"]." GROUP BY cat_id"); + + while ($line = db_fetch_assoc($result)) { + $line["cat_id"] = sprintf("%d", $line["cat_id"]); + print ""; + } + } + + function getCategoryUnread($link, $cat) { + + $result = db_query($link, "SELECT id FROM ttrss_feeds WHERE cat_id = '$cat' + AND owner_uid = " . $_SESSION["uid"]); + + $cat_feeds = array(); + while ($line = db_fetch_assoc($result)) { + array_push($cat_feeds, "feed_id = " . $line["id"]); + } + + $match_part = implode(" OR ", $cat_feeds); + + $result = db_query($link, "SELECT COUNT(int_id) AS unread + FROM ttrss_user_entries + WHERE unread = true AND ($match_part) AND owner_uid = " . $_SESSION["uid"]); + + $unread = 0; + + # this needs to be rewritten + while ($line = db_fetch_assoc($result)) { + $unread += $line["unread"]; + } + + return $unread; + + } + + function getFeedUnread($link, $feed, $is_cat = false) { + $n_feed = sprintf("%d", $feed); + + if ($is_cat) { + return getCategoryUnread($link, $n_feed); + } else if ($n_feed == -1) { + $match_part = "marked = true"; + } else if ($n_feed > 0) { + + $result = db_query($link, "SELECT id FROM ttrss_feeds WHERE parent_feed = '$n_feed' + AND owner_uid = " . $_SESSION["uid"]); + + if (db_num_rows($result) > 0) { + + $linked_feeds = array(); + while ($line = db_fetch_assoc($result)) { + array_push($linked_feeds, "feed_id = " . $line["id"]); + } + + $match_part = implode(" OR ", $linked_feeds); + + $result = db_query($link, "SELECT COUNT(int_id) AS unread + FROM ttrss_user_entries + WHERE unread = true AND ($match_part) AND owner_uid = " . $_SESSION["uid"]); + + $unread = 0; + + # this needs to be rewritten + while ($line = db_fetch_assoc($result)) { + $unread += $line["unread"]; + } + + return $unread; + + } else { + $match_part = "feed_id = '$n_feed'"; + } + } else if ($feed < -10) { + $label_id = -$feed - 11; + + $result = db_query($link, "SELECT sql_exp FROM ttrss_labels WHERE + id = '$label_id' AND owner_uid = " . $_SESSION["uid"]); + + $match_part = db_fetch_result($result, 0, "sql_exp"); + } + + if ($match_part) { + + $result = db_query($link, "SELECT count(int_id) AS unread + FROM ttrss_user_entries + WHERE unread = true AND $match_part AND owner_uid = " . $_SESSION["uid"]); + + } else { + + $result = db_query($link, "SELECT COUNT(post_int_id) AS unread + FROM ttrss_tags,ttrss_user_entries + WHERE tag_name = '$feed' AND post_int_id = int_id AND unread = true AND + ttrss_tags.owner_uid = " . $_SESSION["uid"]); + } + + $unread = db_fetch_result($result, 0, "unread"); + return $unread; + } + + /* FIXME this needs reworking */ + + function getGlobalUnread($link) { + $result = db_query($link, "SELECT count(id) as c_id FROM ttrss_entries,ttrss_user_entries + WHERE unread = true AND + ttrss_user_entries.ref_id = ttrss_entries.id AND + owner_uid = " . $_SESSION["uid"]); + $c_id = db_fetch_result($result, 0, "c_id"); + return $c_id; + } + + function getGlobalCounters($link, $global_unread = -1) { + if ($global_unread == -1) { + $global_unread = getGlobalUnread($link); + } + print ""; + } + + function getTagCounters($link, $smart_mode = SMART_RPC_COUNTERS) { + + if ($smart_mode) { + if (!$_SESSION["tctr_last_value"]) { + $_SESSION["tctr_last_value"] = array(); + } + } + + $old_counters = $_SESSION["tctr_last_value"]; + + $tctrs_modified = false; + +/* $result = db_query($link, "SELECT tag_name,count(ttrss_entries.id) AS count + FROM ttrss_tags,ttrss_entries,ttrss_user_entries WHERE + ttrss_user_entries.ref_id = ttrss_entries.id AND + ttrss_tags.owner_uid = ".$_SESSION["uid"]." AND + post_int_id = ttrss_user_entries.int_id AND unread = true GROUP BY tag_name + UNION + select tag_name,0 as count FROM ttrss_tags + WHERE ttrss_tags.owner_uid = ".$_SESSION["uid"]); */ + + $result = db_query($link, "SELECT tag_name,SUM((SELECT COUNT(int_id) + FROM ttrss_user_entries WHERE int_id = post_int_id + AND unread = true)) AS count FROM ttrss_tags + WHERE owner_uid = 2 GROUP BY tag_name ORDER BY tag_name"); + + $tags = array(); + + while ($line = db_fetch_assoc($result)) { + $tags[$line["tag_name"]] += $line["count"]; + } + + foreach (array_keys($tags) as $tag) { + $unread = $tags[$tag]; + + $tag = htmlspecialchars($tag); + + if (!$smart_mode || $old_counters[$tag] != $unread) { + $old_counters[$tag] = $unread; + $tctrs_modified = true; + print ""; + } + + } + + if ($smart_mode && $tctrs_modified) { + $_SESSION["tctr_last_value"] = $old_counters; + } + + } + + function getLabelCounters($link, $smart_mode = SMART_RPC_COUNTERS, $ret_mode = false) { + + if ($smart_mode) { + if (!$_SESSION["lctr_last_value"]) { + $_SESSION["lctr_last_value"] = array(); + } + } + + $ret_arr = array(); + + $old_counters = $_SESSION["lctr_last_value"]; + $lctrs_modified = false; + + $result = db_query($link, "SELECT count(id) as count FROM ttrss_entries,ttrss_user_entries + WHERE marked = true AND ttrss_user_entries.ref_id = ttrss_entries.id AND + unread = true AND owner_uid = ".$_SESSION["uid"]); + + $count = db_fetch_result($result, 0, "count"); + + if (!$ret_mode) { + print ""; + } else { + $ret_arr["-1"]["counter"] = $count; + $ret_arr["-1"]["description"] = "Starred"; + } + + $result = db_query($link, "SELECT owner_uid,id,sql_exp,description FROM + ttrss_labels WHERE owner_uid = ".$_SESSION["uid"]." ORDER by description"); + + while ($line = db_fetch_assoc($result)) { + + $id = -$line["id"] - 11; + + $label_name = $line["description"]; + + error_reporting (0); + + $tmp_result = db_query($link, "SELECT count(id) as count FROM ttrss_user_entries,ttrss_entries + WHERE (" . $line["sql_exp"] . ") AND unread = true AND + ttrss_user_entries.ref_id = ttrss_entries.id AND + owner_uid = ".$_SESSION["uid"]); + + $count = db_fetch_result($tmp_result, 0, "count"); + + if (!$smart_mode || $old_counters[$id] != $count) { + $old_counters[$id] = $count; + $lctrs_modified = true; + if (!$ret_mode) { + print ""; + } else { + $ret_arr[$id]["counter"] = $count; + $ret_arr[$id]["description"] = $label_name; + } + } + + error_reporting (DEFAULT_ERROR_LEVEL); + } + + if ($smart_mode && $lctrs_modified) { + $_SESSION["lctr_last_value"] = $old_counters; + } + + return $ret_arr; + } + +/* function getFeedCounter($link, $id) { + + $result = db_query($link, "SELECT + count(id) as count,last_error + FROM ttrss_entries,ttrss_user_entries,ttrss_feeds + WHERE feed_id = '$id' AND unread = true + AND ttrss_user_entries.feed_id = ttrss_feeds.id + AND ttrss_user_entries.ref_id = ttrss_entries.id"); + + $count = db_fetch_result($result, 0, "count"); + $last_error = htmlspecialchars(db_fetch_result($result, 0, "last_error")); + + print ""; + } */ + + function getFeedCounters($link, $smart_mode = SMART_RPC_COUNTERS) { + + if ($smart_mode) { + if (!$_SESSION["fctr_last_value"]) { + $_SESSION["fctr_last_value"] = array(); + } + } + + $old_counters = $_SESSION["fctr_last_value"]; + + $result = db_query($link, "SELECT id,last_error,parent_feed, + SUBSTRING(last_updated,1,19) AS last_updated, + (SELECT count(id) + FROM ttrss_entries,ttrss_user_entries + WHERE feed_id = ttrss_feeds.id AND + ttrss_user_entries.ref_id = ttrss_entries.id + AND unread = true AND owner_uid = ".$_SESSION["uid"].") as count + FROM ttrss_feeds WHERE owner_uid = ".$_SESSION["uid"] . " + AND parent_feed IS NULL"); + + $fctrs_modified = false; + + $short_date = get_pref($link, 'SHORT_DATE_FORMAT'); + + while ($line = db_fetch_assoc($result)) { + + $id = $line["id"]; + $count = $line["count"]; + $last_error = htmlspecialchars($line["last_error"]); + + if (get_pref($link, 'HEADLINES_SMART_DATE')) { + $last_updated = smart_date_time(strtotime($line["last_updated"])); + } else { + $last_updated = date($short_date, strtotime($line["last_updated"])); + } + + $has_img = is_file(ICONS_DIR . "/$id.ico"); + + $tmp_result = db_query($link, + "SELECT id,COUNT(unread) AS unread + FROM ttrss_feeds LEFT JOIN ttrss_user_entries + ON (ttrss_feeds.id = ttrss_user_entries.feed_id) + WHERE parent_feed = '$id' AND unread = true GROUP BY ttrss_feeds.id"); + + if (db_num_rows($tmp_result) > 0) { + while ($l = db_fetch_assoc($tmp_result)) { + $count += $l["unread"]; + } + } + + if (!$smart_mode || $old_counters[$id] != $count) { + $old_counters[$id] = $count; + $fctrs_modified = true; + + if ($last_error) { + $error_part = "error=\"$last_error\""; + } else { + $error_part = ""; + } + + if ($has_img) { + $has_img_part = "hi=\"$has_img\""; + } else { + $has_img_part = ""; + } + + print ""; + } + } + + if ($smart_mode && $fctrs_modified) { + $_SESSION["fctr_last_value"] = $old_counters; + } + } + + function get_script_dt_add() { + if (strpos(VERSION, "99") === false) { + return VERSION; + } else { + return time(); + } + } + + function get_pgsql_version($link) { + $result = db_query($link, "SELECT version() AS version"); + $version = split(" ", db_fetch_result($result, 0, "version")); + return $version[1]; + } + + function print_error_xml($code, $add_msg = "") { + global $ERRORS; + + $error_msg = $ERRORS[$code]; + + if ($add_msg) { + $error_msg = "$error_msg; $add_msg"; + } + + print ""; + print ""; + print ""; + } + + function subscribe_to_feed($link, $feed_link, $cat_id = 0) { + + if ($cat_id == "0" || !$cat_id) { + $cat_qpart = "NULL"; + } else { + $cat_qpart = "'$cat_id'"; + } + + $result = db_query($link, + "SELECT id FROM ttrss_feeds + WHERE feed_url = '$feed_link' AND owner_uid = ".$_SESSION["uid"]); + + if (db_num_rows($result) == 0) { + + $result = db_query($link, + "INSERT INTO ttrss_feeds (owner_uid,feed_url,title,cat_id) + VALUES ('".$_SESSION["uid"]."', '$feed_link', + '[Unknown]', $cat_qpart)"); + + $result = db_query($link, + "SELECT id FROM ttrss_feeds WHERE feed_url = '$feed_link' + AND owner_uid = " . $_SESSION["uid"]); + + $feed_id = db_fetch_result($result, 0, "id"); + + if ($feed_id) { + update_rss_feed($link, $feed_link, $feed_id, true); + } + + return true; + } else { + return false; + } + } + + function print_feed_select($link, $id, $default_id = "", + $attributes = "", $include_all_feeds = true) { + + print ""; + } + + function print_feed_cat_select($link, $id, $default_id = "", + $attributes = "", $include_all_cats = true) { + + print ""; + } + + function checkbox_to_sql_bool($val) { + return ($val == "on") ? "true" : "false"; + } + + function getFeedCatTitle($link, $id) { + if ($id == -1) { + return "Special"; + } else if ($id < -10) { + return "Labels"; + } else if ($id > 0) { + $result = db_query($link, "SELECT ttrss_feed_categories.title + FROM ttrss_feeds, ttrss_feed_categories WHERE ttrss_feeds.id = '$id' AND + cat_id = ttrss_feed_categories.id"); + if (db_num_rows($result) == 1) { + return db_fetch_result($result, 0, "title"); + } else { + return "Uncategorized"; + } + } else { + return "getFeedCatTitle($id) failed"; + } + + } + + function getFeedTitle($link, $id) { + if ($id == -1) { + return "Starred articles"; + } else if ($id < -10) { + $label_id = -10 - $id; + $result = db_query($link, "SELECT description FROM ttrss_labels WHERE id = '$label_id'"); + if (db_num_rows($result) == 1) { + return db_fetch_result($result, 0, "description"); + } else { + return "Unknown label ($label_id)"; + } + + } else if ($id > 0) { + $result = db_query($link, "SELECT title FROM ttrss_feeds WHERE id = '$id'"); + if (db_num_rows($result) == 1) { + return db_fetch_result($result, 0, "title"); + } else { + return "Unknown feed ($id)"; + } + } else { + return "getFeedTitle($id) failed"; + } + + } + + function get_session_cookie_name() { + return ((!defined('TTRSS_SESSION_NAME')) ? "ttrss_sid" : TTRSS_SESSION_NAME); + } + + function print_init_params($link) { + print ""; + if ($_SESSION["stored-params"]) { + foreach (array_keys($_SESSION["stored-params"]) as $key) { + $value = htmlspecialchars($_SESSION["stored-params"][$key]); + print ""; + } + } + + print ""; + print ""; + print ""; + + print ""; + + print ""; + + print ""; + + print ""; + } + + function print_runtime_info($link) { + print ""; + if (ENABLE_UPDATE_DAEMON) { + print ""; + } + print ""; + } + + function queryFeedHeadlines($link, $feed, $limit, $view_mode, $cat_view, $search, $search_mode, $match_on) { + + if ($search) { + if ($match_on == "both") { + $search_query_part = "(upper(ttrss_entries.title) LIKE upper('%$search%') + OR upper(ttrss_entries.content) LIKE '%$search%') AND"; + } else if ($match_on == "title") { + $search_query_part = "upper(ttrss_entries.title) LIKE upper('%$search%') + AND"; + } else if ($match_on == "content") { + $search_query_part = "upper(ttrss_entries.content) LIKE upper('%$search%') AND"; + } + } else { + $search_query_part = ""; + } + + $view_query_part = ""; + + if ($view_mode == "adaptive") { + if ($search) { + $view_query_part = " "; + } else if ($feed != -1) { + $unread = getFeedUnread($link, $feed, $cat_view); + if ($unread > 0) { + $view_query_part = " unread = true AND "; + } + } + } + + if ($view_mode == "marked") { + $view_query_part = " marked = true AND "; + } + + if ($view_mode == "unread") { + $view_query_part = " unread = true AND "; + } + + if ($limit > 0) { + $limit_query_part = "LIMIT " . $limit; + } + + $vfeed_query_part = ""; + + // override query strategy and enable feed display when searching globally + if ($search && $search_mode == "all_feeds") { + $query_strategy_part = "ttrss_entries.id > 0"; + $vfeed_query_part = "ttrss_feeds.title AS feed_title,"; + } else if (preg_match("/^-?[0-9][0-9]*$/", $feed) == false) { + $query_strategy_part = "ttrss_entries.id > 0"; + $vfeed_query_part = "(SELECT title FROM ttrss_feeds WHERE + id = feed_id) as feed_title,"; + } else if ($feed >= 0 && $search && $search_mode == "this_cat") { + + $vfeed_query_part = "ttrss_feeds.title AS feed_title,"; + + $tmp_result = db_query($link, "SELECT id + FROM ttrss_feeds WHERE cat_id = + (SELECT cat_id FROM ttrss_feeds WHERE id = '$feed') AND id != '$feed'"); + + $cat_siblings = array(); + + if (db_num_rows($tmp_result) > 0) { + while ($p = db_fetch_assoc($tmp_result)) { + array_push($cat_siblings, "feed_id = " . $p["id"]); + } + + $query_strategy_part = sprintf("(feed_id = %d OR %s)", + $feed, implode(" OR ", $cat_siblings)); + + } else { + $query_strategy_part = "ttrss_entries.id > 0"; + } + + } else if ($feed >= 0) { + + if ($cat_view) { + + if ($feed > 0) { + $query_strategy_part = "cat_id = '$feed'"; + } else { + $query_strategy_part = "cat_id IS NULL"; + } + + $vfeed_query_part = "ttrss_feeds.title AS feed_title,"; + + } else { + $tmp_result = db_query($link, "SELECT id + FROM ttrss_feeds WHERE parent_feed = '$feed' + ORDER BY cat_id,title"); + + $parent_ids = array(); + + if (db_num_rows($tmp_result) > 0) { + while ($p = db_fetch_assoc($tmp_result)) { + array_push($parent_ids, "feed_id = " . $p["id"]); + } + + $query_strategy_part = sprintf("(feed_id = %d OR %s)", + $feed, implode(" OR ", $parent_ids)); + + $vfeed_query_part = "ttrss_feeds.title AS feed_title,"; + } else { + $query_strategy_part = "feed_id = '$feed'"; + } + } + } else if ($feed == -1) { // starred virtual feed + $query_strategy_part = "marked = true"; + $vfeed_query_part = "ttrss_feeds.title AS feed_title,"; + } else if ($feed <= -10) { // labels + $label_id = -$feed - 11; + + $tmp_result = db_query($link, "SELECT sql_exp FROM ttrss_labels + WHERE id = '$label_id'"); + + $query_strategy_part = db_fetch_result($tmp_result, 0, "sql_exp"); + + $vfeed_query_part = "ttrss_feeds.title AS feed_title,"; + } else { + $query_strategy_part = "id > 0"; // dumb + } + + $order_by = "updated DESC"; + + $feed_title = ""; + + if ($search && $search_mode == "all_feeds") { + $feed_title = "Global search results ($search)"; + } else if ($search && preg_match('/^-?[0-9][0-9]*$/', $feed) == false) { + $feed_title = "Feed search results ($search, $feed)"; + } else if (preg_match('/^-?[0-9][0-9]*$/', $feed) == false) { + $feed_title = $feed; + } else if (preg_match('/^-?[0-9][0-9]*$/', $feed) != false && $feed >= 0) { + + if ($cat_view) { + + if ($feed != 0) { + $result = db_query($link, "SELECT title FROM ttrss_feed_categories + WHERE id = '$feed' AND owner_uid = " . $_SESSION["uid"]); + $feed_title = db_fetch_result($result, 0, "title"); + } else { + $feed_title = "Uncategorized"; + } + } else { + + $result = db_query($link, "SELECT title,site_url,last_error FROM ttrss_feeds + WHERE id = '$feed' AND owner_uid = " . $_SESSION["uid"]); + + $feed_title = db_fetch_result($result, 0, "title"); + $feed_site_url = db_fetch_result($result, 0, "site_url"); + $last_error = db_fetch_result($result, 0, "last_error"); + + } + + } else if ($feed == -1) { + $feed_title = "Starred articles"; + } else if ($feed < -10) { + $label_id = -$feed - 11; + $result = db_query($link, "SELECT description FROM ttrss_labels + WHERE id = '$label_id'"); + $feed_title = db_fetch_result($result, 0, "description"); + } else { + $feed_title = "?"; + } + + $feed_title = db_unescape_string($feed_title); + + if ($feed < -10) error_reporting (0); + + if (preg_match("/^-?[0-9][0-9]*$/", $feed) != false) { + + if ($feed >= 0) { + $feed_kind = "Feeds"; + } else { + $feed_kind = "Labels"; + } + + $content_query_part = "content as content_preview,"; + + $query = "SELECT + ttrss_entries.id,ttrss_entries.title, + SUBSTRING(updated,1,16) as updated, + unread,feed_id,marked,link,last_read, + SUBSTRING(last_read,1,19) as last_read_noms, + $vfeed_query_part + $content_query_part + SUBSTRING(updated,1,19) as updated_noms + FROM + ttrss_entries,ttrss_user_entries,ttrss_feeds + WHERE + ttrss_user_entries.feed_id = ttrss_feeds.id AND + ttrss_user_entries.ref_id = ttrss_entries.id AND + ttrss_user_entries.owner_uid = '".$_SESSION["uid"]."' AND + $search_query_part + $view_query_part + $query_strategy_part ORDER BY $order_by + $limit_query_part"; + + $result = db_query($link, $query); + + if ($_GET["debug"]) print $query; + + } else { + // browsing by tag + + $feed_kind = "Tags"; + + $result = db_query($link, "SELECT + ttrss_entries.id as id,title, + SUBSTRING(updated,1,16) as updated, + unread,feed_id, + marked,link,last_read, + SUBSTRING(last_read,1,19) as last_read_noms, + $vfeed_query_part + $content_query_part + SUBSTRING(updated,1,19) as updated_noms + FROM + ttrss_entries,ttrss_user_entries,ttrss_tags + WHERE + ref_id = ttrss_entries.id AND + ttrss_user_entries.owner_uid = '".$_SESSION["uid"]."' AND + post_int_id = int_id AND tag_name = '$feed' AND + $view_query_part + $search_query_part + $query_strategy_part ORDER BY $order_by + $limit_query_part"); + } + + return array($result, $feed_title, $feed_site_url, $last_error); + + } + ?>