exit;
}
- define('SCHEMA_VERSION', 2);
+ define('SCHEMA_VERSION', 3);
require_once "sanity_check.php";
require_once "config.php";
setcookie("ttrss_icons_url", ICONS_URL);
+ if (!sanity_check($link)) { return; }
+
function getAllCounters($link) {
getLabelCounters($link);
getFeedCounters($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");
+ WHERE
+ owner_uid = ".$_SESSION["uid"]." GROUP BY cat_id");
while ($line = db_fetch_assoc($result)) {
$line["cat_id"] = sprintf("%d", $line["cat_id"]);
}
}
- function getFeedCounter($link, $id) {
+/* function getFeedCounter($link, $id) {
$result = db_query($link, "SELECT
count(id) as count,last_error
$last_error = htmlspecialchars(db_fetch_result($result, 0, "last_error"));
print "<counter type=\"feed\" id=\"$id\" counter=\"$count\" error=\"$last_error\"/>";
- }
+ } */
function getFeedCounters($link, $smart_mode = SMART_RPC_COUNTERS) {
$old_counters = $_SESSION["fctr_last_value"];
- $result = db_query($link, "SELECT id,last_error,
+ $result = db_query($link, "SELECT id,last_error,parent_feed,
(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"]);
+ FROM ttrss_feeds WHERE owner_uid = ".$_SESSION["uid"] . "
+ AND parent_feed IS NULL");
$fctrs_modified = false;
$id = $line["id"];
$count = $line["count"];
- $last_error = htmlspecialchars($line["last_error"]);
-
+ $last_error = htmlspecialchars($line["last_error"]);
+
$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;
$order_by_qpart = "title";
}
- $result = db_query($link, "SELECT *,
- (SELECT count(id) FROM ttrss_entries,ttrss_user_entries
+ $result = db_query($link, "SELECT ttrss_feeds.*,
+ (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
owner_uid = '$owner_uid') AS total,
- (SELECT count(id) FROM ttrss_entries,ttrss_user_entries
+ (SELECT COUNT(id) FROM ttrss_entries,ttrss_user_entries
WHERE feed_id = ttrss_feeds.id AND unread = true
AND ttrss_user_entries.ref_id = ttrss_entries.id
AND owner_uid = '$owner_uid') as unread,
- (SELECT title FROM ttrss_feed_categories
- WHERE id = cat_id) AS category,
cat_id,last_error,
- (SELECT collapsed FROM ttrss_feed_categories
- WHERE id = cat_id) AS collapsed
- FROM ttrss_feeds WHERE owner_uid = '$owner_uid' ORDER BY $order_by_qpart");
-
+ ttrss_feed_categories.title AS category,
+ ttrss_feed_categories.collapsed
+ FROM ttrss_feeds LEFT JOIN ttrss_feed_categories
+ ON (ttrss_feed_categories.id = cat_id)
+ WHERE
+ ttrss_feeds.owner_uid = '$owner_uid' AND parent_feed IS NULL
+ ORDER BY $order_by_qpart");
+
$actid = $_GET["actid"];
/* real feeds */
$total = $line["total"];
$unread = $line["unread"];
+ $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 = '$feed_id' AND unread = true
+ GROUP BY ttrss_feeds.id");
+
+ if (db_num_rows($tmp_result) > 0) {
+ while ($l = db_fetch_assoc($tmp_result)) {
+ $unread += $l["unread"];
+ }
+ }
+
$cat_id = $line["cat_id"];
$tmp_category = $line["category"];
// !!! NO SPACE before <ul...feedCatList - breaks firstChild DOM function
// -> keyboard navigation, etc.
- print "<li id=\"feedCatHolder\" class=\"$holder_class\"><ul class=\"feedCatList\">";
+ print "<li id=\"feedCatHolder\" class=\"$holder_class\"><ul class=\"feedCatList\" id=\"FCATLIST-$cat_id\">";
}
printFeedEntry($feed_id, $class, $feed, $unread,
}
if ($subop == "sanityCheck") {
-
- $error_code = 0;
-
- $result = db_query($link, "SELECT schema_version FROM ttrss_version");
-
- $schema_version = db_fetch_result($result, 0, "schema_version");
-
- if ($schema_version != SCHEMA_VERSION) {
- $error_code = 5;
- }
-
- print "<error error-code='$error_code'/>";
+ sanity_check();
}
if ($subop == "globalPurge") {
if (sprintf("%d", $feed) != 0) {
if ($feed > 0) {
- db_query($link, "UPDATE ttrss_user_entries
- SET unread = false,last_read = NOW()
- WHERE feed_id = '$feed' AND owner_uid = " . $_SESSION["uid"]);
+
+ $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
$view_query_part = " unread = true AND ";
}
-/* if ($view_mode == "Unread or Starred") {
- $view_query_part = " (unread = true OR marked = true) AND ";
- }
-
- if ($view_mode == "Unread or Updated") {
- $view_query_part = " (unread = true OR last_read is NULL) AND ";
- } */
-
-/* $result = db_query($link, "SELECT count(id) AS total_entries
- FROM ttrss_entries WHERE
- $search_query_part
- feed_id = '$feed'");
-
- $total_entries = db_fetch_result($result, 0, "total_entries"); */
-
-/* $result = db_query("SELECT count(id) AS unread_entries
- FROM ttrss_entries WHERE
- $search_query_part
- unread = true AND
- feed_id = '$feed'");
-
- $unread_entries = db_fetch_result($result, 0, "unread_entries"); */
-
if ($limit && $limit != "All") {
$limit_query_part = "LIMIT " . $limit;
}
// override query strategy and enable feed display when searching globally
if ($search && $search_mode == "All feeds") {
$query_strategy_part = "id > 0";
- $vfeed_query_part = "(SELECT title FROM ttrss_feeds WHERE
- id = feed_id) as feed_title,";
+ $vfeed_query_part = "ttrss_feeds.title AS feed_title,";
} else if (sprintf("%d", $feed) == 0) {
$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) {
- $query_strategy_part = "feed_id = '$feed'";
+
+ $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 = "(SELECT title FROM ttrss_feeds WHERE
- id = feed_id) as feed_title,";
+ $vfeed_query_part = "ttrss_feeds.title AS feed_title,";
} else if ($feed <= -10) { // labels
$label_id = -$feed - 11;
$query_strategy_part = db_fetch_result($tmp_result, 0, "sql_exp");
- $vfeed_query_part = "(SELECT title FROM ttrss_feeds WHERE
- id = feed_id) as feed_title,";
+ $vfeed_query_part = "ttrss_feeds.title AS feed_title,";
} else {
$query_strategy_part = "id > 0"; // dumb
}
// }
$result = db_query($link, "SELECT
- id,title,
+ 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,
$content_query_part
SUBSTRING(updated,1,19) as updated_noms
FROM
- ttrss_entries,ttrss_user_entries
+ 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
- owner_uid = '".$_SESSION["uid"]."' AND
+ ttrss_user_entries.owner_uid = '".$_SESSION["uid"]."' AND
$search_query_part
$view_query_part
$query_strategy_part ORDER BY $order_by
print "<td class=\"headlineActions\">
Select:
<a href=\"javascript:selectTableRowsByIdPrefix('headlinesList',
- 'RROW-', 'RCHK-', true)\">All</a>,
+ 'RROW-', 'RCHK-', true, '', true)\">All</a>,
<a href=\"javascript:selectTableRowsByIdPrefix('headlinesList',
- 'RROW-', 'RCHK-', true, 'Unread')\">Unread</a>,
+ 'RROW-', 'RCHK-', true, 'Unread', true)\">Unread</a>,
<a href=\"javascript:selectTableRowsByIdPrefix('headlinesList',
'RROW-', 'RCHK-', false)\">None</a>
$subop = $_REQUEST["subop"];
$quiet = $_REQUEST["quiet"];
+ if ($subop == "browse") {
+
+ print "<div class=\"infoBoxContents\">";
+
+ print "<h1>Feed browser</h1>";
+
+ print "<p>Showing top 50 registered feeds, sorted by popularity:</p>";
+
+ $result = db_query($link, "SELECT feed_url,count(id) AS subscribers
+ FROM ttrss_feeds WHERE auth_login = '' AND auth_pass = ''
+ GROUP BY feed_url ORDER BY subscribers LIMIT 50");
+
+ print "<ul class='browseFeedList' id='browseFeedList'>";
+
+ while ($line = db_fetch_assoc($result)) {
+ $feed_url = $line["feed_url"];
+ $subscribers = $line["subscribers"];
+
+ $det_result = db_query($link, "SELECT site_url,title,id
+ FROM ttrss_feeds WHERE feed_url = '$feed_url' LIMIT 1");
+
+ $details = db_fetch_assoc($det_result);
+
+ $icon_file = ICONS_DIR . "/" . $details["id"] . ".ico";
+
+ if (file_exists($icon_file) && filesize($icon_file) > 0) {
+ $feed_icon = "<img class=\"tinyFeedIcon\" src=\"" . ICONS_URL .
+ "/".$details["id"].".ico\">";
+ } else {
+ $feed_icon = "<img class=\"tinyFeedIcon\" src=\"images/blank_icon.gif\">";
+ }
+
+ $check_box = "<input class='feedBrowseCB' type=\"checkbox\" id=\"BFCHK-" . $details["id"] . "\">";
+
+ print "<li>$check_box $feed_icon" . $details["title"] .
+ " <span class='subscribers'>($subscribers)</span></li>";
+ }
+
+ print "</ul>";
+
+ print "<div align='center'>
+ <input type='submit' class='button'
+ onclick=\"closeInfoBox()\" value=\"Cancel\">
+ <input type=\"submit\" class=\"button\"
+ onclick=\"feedBrowserSubscribe()\" value=\"Subscribe\"></div>";
+
+ print "</div>";
+ return;
+ }
+
if ($subop == "editfeed") {
$feed_id = db_escape_string($_GET["id"]);
print "<td><input id=\"iedit_updintl\"
value=\"$update_interval\"></td></tr>";
+ $row_class = toggleEvenOdd($row_class);
+ print "<tr class='$row_class'><td>Link to:</td>";
+
+ $parent_feed = db_fetch_result($result, 0, "parent_feed");
+
+ print "<select id=\"iedit_parent_feed\">";
+ print "<option id=\"0\">Not linked</option>";
+
+ if (get_pref($link, 'ENABLE_FEED_CATS')) {
+ if ($cat_id) {
+ $cat_qpart = "AND cat_id = '$cat_id'";
+ } else {
+ $cat_qpart = "AND cat_id IS NULL";
+ }
+ }
+
+ $tmp_result = db_query($link, "SELECT id,title FROM ttrss_feeds
+ WHERE owner_uid = ".$_SESSION["uid"]." $cat_qpart ORDER BY title");
+
+ if (db_num_rows($tmp_result) > 0) {
+ print "<option disabled>--------</option>";
+ }
+
+ while ($tmp_line = db_fetch_assoc($tmp_result)) {
+ if ($tmp_line["id"] == $parent_feed) {
+ $is_selected = "selected";
+ } else {
+ $is_selected = "";
+ }
+ printf("<option $is_selected id='%d'>%s</option>",
+ $tmp_line["id"], $tmp_line["title"]);
+ }
+
+ print "</select></td>";
+ print "</td></tr>";
+
$purge_interval = db_fetch_result($result, 0, "purge_interval");
$row_class = toggleEvenOdd($row_class);
$cat_id = db_escape_string($_POST["catid"]);
$auth_login = db_escape_string($_POST["login"]);
$auth_pass = db_escape_string($_POST["pass"]);
+ $parent_feed = db_escape_string($_POST["pfeed"]);
if (strtoupper($upd_intl) == "DEFAULT")
$upd_intl = 0;
$category_qpart = 'cat_id = NULL';
}
+ if ($parent_feed != 0) {
+ $parent_qpart = "parent_feed = '$parent_feed'";
+ } else {
+ $parent_qpart = 'parent_feed = NULL';
+ }
+
$result = db_query($link, "UPDATE ttrss_feeds SET
$category_qpart,
+ $parent_qpart,
title = '$feed_title', feed_url = '$feed_link',
update_interval = '$upd_intl',
purge_interval = '$purge_intl',
$feed_link = db_escape_string(trim($_GET["link"]));
$cat_id = db_escape_string($_GET["cid"]);
- if ($cat_id == "0") {
+ if ($cat_id == "0" || !$cat_id) {
$cat_qpart = "NULL";
} else {
$cat_qpart = "'$cat_id'";
size=\"40\">
<input type=\"submit\" class=\"button\"
onclick=\"javascript:addFeed()\" value=\"Add feed\">
+
+ (<a href='javascript:browseFeeds()'>Browse feeds</a>)
</td><td align='right'>
<input id=\"feed_search\" size=\"20\"
onchange=\"javascript:updateFeedList()\"
$_SESSION["pref_sort_feeds"] = $feeds_sort;
if ($feed_search) {
- $search_qpart = "(UPPER(title) LIKE UPPER('%$feed_search%') OR
- UPPER(feed_url) LIKE UPPER('%$feed_search%')) AND";
+ $search_qpart = "(UPPER(F1.title) LIKE UPPER('%$feed_search%') OR
+ UPPER(F1.feed_url) LIKE UPPER('%$feed_search%')) AND";
} else {
$search_qpart = "";
}
$result = db_query($link, "SELECT
- id,title,feed_url,substring(last_updated,1,16) as last_updated,
- update_interval,purge_interval,cat_id,
- (SELECT title FROM ttrss_feed_categories
- WHERE id = cat_id) AS category
+ F1.id,
+ F1.title,
+ F1.feed_url,
+ substring(F1.last_updated,1,16) AS last_updated,
+ F1.parent_feed,
+ F1.update_interval,
+ F1.purge_interval,
+ F1.cat_id,
+ F2.title AS parent_title,
+ C1.title AS category
FROM
- ttrss_feeds
+ ttrss_feeds AS F1
+ LEFT JOIN ttrss_feeds AS F2
+ ON (F1.parent_feed = F2.id)
+ LEFT JOIN ttrss_feed_categories AS C1
+ ON (F1.cat_id = C1.id)
WHERE
- $search_qpart owner_uid = '".$_SESSION["uid"]."'
+ $search_qpart F1.owner_uid = '".$_SESSION["uid"]."'
ORDER by category,$feeds_sort,title");
if (db_num_rows($result) != 0) {
$edit_title = truncate_string($edit_title, 40);
$edit_link = truncate_string($edit_link, 60);
+ $parent_title = $line["parent_title"];
+ if ($parent_title) {
+ $parent_title = "<span class='groupPrompt'>(linked to
+ $parent_title)</span>";
+ }
+
print "<td><a href=\"javascript:editFeed($feed_id);\">" .
- "$feed_icon $edit_title" . "</a></td>";
+ "$feed_icon $edit_title $parent_title" . "</a></td>";
print "<td><a href=\"javascript:editFeed($feed_id);\">" .
$edit_link . "</a></td>";
ttrss_filter_types.description AS filter_type_descr,
feed_id,
ttrss_filter_actions.description AS action_description,
- (SELECT title FROM ttrss_feeds WHERE id = feed_id) AS feed_title
+ ttrss_feeds.title AS feed_title
FROM
- ttrss_filters,ttrss_filter_types,ttrss_filter_actions
+ ttrss_filters,ttrss_filter_types,ttrss_filter_actions LEFT JOIN
+ ttrss_feeds ON (feed_id = ttrss_feeds.id)
WHERE
filter_type = ttrss_filter_types.id AND
ttrss_filter_actions.id = action_id AND
$_SESSION["prefs_op_result"] = "save-config";
+ $_SESSION["prefs_cache"] = false;
+
foreach (array_keys($_POST) as $pref_name) {
$pref_name = db_escape_string($pref_name);
print "Unknown option: $pref_name";
}
+ } else if ($subop == "Change e-mail") {
+
+ if (WEB_DEMO_MODE) {
+ header("Location: prefs.php");
+ return;
+ }
+
+ $email = db_escape_string($_GET["email"]);
+ $active_uid = $_SESSION["uid"];
+
+ if ($email) {
+ db_query($link, "UPDATE ttrss_users SET email = '$email'
+ WHERE id = '$active_uid'");
+ }
+
+ header("Location: prefs.php");
+
} else if ($subop == "Change password") {
if (WEB_DEMO_MODE) {
if (!SINGLE_USER_MODE) {
- $result = db_query($link, "SELECT id FROM ttrss_users
+ $result = db_query($link, "SELECT id,email FROM ttrss_users
WHERE id = ".$_SESSION["uid"]." AND (pwd_hash = 'password' OR
pwd_hash = 'SHA1:".sha1("password")."')");
$_SESSION["prefs_op_result"] = "";
+ print "<form action=\"backend.php\" method=\"GET\">";
+
+ print "<table width=\"100%\" class=\"prefPrefsList\">";
+ print "<tr><td colspan='3'><h3>Personal data</h3></tr></td>";
+
+ $result = db_query($link, "SELECT email FROM ttrss_users
+ WHERE id = ".$_SESSION["uid"]);
+
+ $email = db_fetch_result($result, 0, "email");
+
+ print "<tr><td width=\"40%\">E-mail</td>";
+ print "<td><input class=\"editbox\" name=\"email\"
+ value=\"$email\"></td></tr>";
+
+ print "</table>";
+
+ print "<input type=\"hidden\" name=\"op\" value=\"pref-prefs\">";
+
+ print "<p><input class=\"button\" type=\"submit\"
+ value=\"Change e-mail\" name=\"subop\">";
+
print "<form action=\"backend.php\" method=\"POST\">";
print "<table width=\"100%\" class=\"prefPrefsList\">";
$uid = $line["id"];
$edit_uid = $_GET["id"];
- if ($uid == $_SESSION["uid"] || ($subop == "edit" && $uid != $edit_uid)) {
+ if ($subop == "edit" && $uid != $edit_uid) {
$class .= "Grayed";
$this_row_id = "";
} else {
print "<h1>Subscribed feeds</h1>";
$result = db_query($link, "SELECT id,title,site_url FROM ttrss_feeds
- WHERE owner_uid = '$uid' ORDER BY title LIMIT 20");
+ WHERE owner_uid = '$uid' ORDER BY title");
- print "<ul class=\"nomarks\">";
+ print "<ul class=\"userFeedList\">";
while ($line = db_fetch_assoc($result)) {