/** * Update a feed batch. * Used by daemons to update n feeds by run. * Only update feed needing a update, and not being processed * by another process. * * @param mixed $link Database link * @param integer $limit Maximum number of feeds in update batch. Default to DAEMON_FEED_LIMIT. * @param boolean $from_http Set to true if you call this function from http to disable cli specific code. * @param boolean $debug Set to false to disable debug output. Default to true. * @return void */ function update_daemon_common($limit = DAEMON_FEED_LIMIT, $from_http = false, $debug = true) { // Process all other feeds using last_updated and interval parameters $schema_version = get_schema_version(); if ($schema_version != SCHEMA_VERSION) { die("Schema version is wrong, please upgrade the database.\n"); } define('PREFS_NO_CACHE', true); // Test if the user has loggued in recently. If not, it does not update its feeds. if (!SINGLE_USER_MODE && DAEMON_UPDATE_LOGIN_LIMIT > 0) { if (DB_TYPE == "pgsql") { $login_thresh_qpart = "AND ttrss_users.last_login >= NOW() - INTERVAL '" . DAEMON_UPDATE_LOGIN_LIMIT . " days'"; } else { $login_thresh_qpart = "AND ttrss_users.last_login >= DATE_SUB(NOW(), INTERVAL " . DAEMON_UPDATE_LOGIN_LIMIT . " DAY)"; } } else { $login_thresh_qpart = ""; } // Test if the feed need a update (update interval exceded). if (DB_TYPE == "pgsql") { $update_limit_qpart = "AND ((\n\t\t\t\t\tttrss_feeds.update_interval = 0\n\t\t\t\t\tAND ttrss_user_prefs.value != '-1'\n\t\t\t\t\tAND ttrss_feeds.last_updated < NOW() - CAST((ttrss_user_prefs.value || ' minutes') AS INTERVAL)\n\t\t\t\t) OR (\n\t\t\t\t\tttrss_feeds.update_interval > 0\n\t\t\t\t\tAND ttrss_feeds.last_updated < NOW() - CAST((ttrss_feeds.update_interval || ' minutes') AS INTERVAL)\n\t\t\t\t) OR ttrss_feeds.last_updated IS NULL\n\t\t\t\tOR last_updated = '1970-01-01 00:00:00')"; } else { $update_limit_qpart = "AND ((\n\t\t\t\t\tttrss_feeds.update_interval = 0\n\t\t\t\t\tAND ttrss_user_prefs.value != '-1'\n\t\t\t\t\tAND ttrss_feeds.last_updated < DATE_SUB(NOW(), INTERVAL CONVERT(ttrss_user_prefs.value, SIGNED INTEGER) MINUTE)\n\t\t\t\t) OR (\n\t\t\t\t\tttrss_feeds.update_interval > 0\n\t\t\t\t\tAND ttrss_feeds.last_updated < DATE_SUB(NOW(), INTERVAL ttrss_feeds.update_interval MINUTE)\n\t\t\t\t) OR ttrss_feeds.last_updated IS NULL\n\t\t\t\tOR last_updated = '1970-01-01 00:00:00')"; } // Test if feed is currently being updated by another process. if (DB_TYPE == "pgsql") { $updstart_thresh_qpart = "AND (ttrss_feeds.last_update_started IS NULL OR ttrss_feeds.last_update_started < NOW() - INTERVAL '10 minutes')"; } else { $updstart_thresh_qpart = "AND (ttrss_feeds.last_update_started IS NULL OR ttrss_feeds.last_update_started < DATE_SUB(NOW(), INTERVAL 10 MINUTE))"; } // Test if there is a limit to number of updated feeds $query_limit = ""; if ($limit) { $query_limit = sprintf("LIMIT %d", $limit); } $query = "SELECT DISTINCT ttrss_feeds.feed_url, ttrss_feeds.last_updated\n\t\t\tFROM\n\t\t\t\tttrss_feeds, ttrss_users, ttrss_user_prefs\n\t\t\tWHERE\n\t\t\t\tttrss_feeds.owner_uid = ttrss_users.id\n\t\t\t\tAND ttrss_users.id = ttrss_user_prefs.owner_uid\n\t\t\t\tAND ttrss_user_prefs.pref_name = 'DEFAULT_UPDATE_INTERVAL'\n\t\t\t\t{$login_thresh_qpart} {$update_limit_qpart}\n\t\t\t\t{$updstart_thresh_qpart}\n\t\t\t\tORDER BY last_updated {$query_limit}"; // We search for feed needing update. $result = db_query($query); if ($debug) { _debug(sprintf("Scheduled %d feeds to update...", db_num_rows($result))); } // Here is a little cache magic in order to minimize risk of double feed updates. $feeds_to_update = array(); while ($line = db_fetch_assoc($result)) { array_push($feeds_to_update, db_escape_string($line['feed_url'])); } // We update the feed last update started date before anything else. // There is no lag due to feed contents downloads // It prevent an other process to update the same feed. if (count($feeds_to_update) > 0) { $feeds_quoted = array(); foreach ($feeds_to_update as $feed) { array_push($feeds_quoted, "'" . db_escape_string($feed) . "'"); } db_query(sprintf("UPDATE ttrss_feeds SET last_update_started = NOW()\n\t\t\t\tWHERE feed_url IN (%s)", implode(',', $feeds_quoted))); } $nf = 0; // For each feed, we call the feed update function. foreach ($feeds_to_update as $feed) { if ($debug) { _debug("Base feed: {$feed}"); } //update_rss_feed($line["id"], true); // since we have the data cached, we can deal with other feeds with the same url $tmp_result = db_query("SELECT DISTINCT ttrss_feeds.id,last_updated,ttrss_feeds.owner_uid\n\t\t\tFROM ttrss_feeds, ttrss_users, ttrss_user_prefs WHERE\n\t\t\t\tttrss_user_prefs.owner_uid = ttrss_feeds.owner_uid AND\n\t\t\t\tttrss_users.id = ttrss_user_prefs.owner_uid AND\n\t\t\t\tttrss_user_prefs.pref_name = 'DEFAULT_UPDATE_INTERVAL' AND\n\t\t\t\tfeed_url = '" . db_escape_string($feed) . "' AND\n\t\t\t\t(ttrss_feeds.update_interval > 0 OR\n\t\t\t\t\tttrss_user_prefs.value != '-1')\n\t\t\t\t{$login_thresh_qpart}\n\t\t\tORDER BY ttrss_feeds.id {$query_limit}"); if (db_num_rows($tmp_result) > 0) { while ($tline = db_fetch_assoc($tmp_result)) { if ($debug) { _debug(" => " . $tline["last_updated"] . ", " . $tline["id"] . " " . $tline["owner_uid"]); } update_rss_feed($tline["id"], true); ++$nf; } } } require_once "digest.php"; // Send feed digests by email if needed. send_headlines_digests($debug); return $nf; }
print "-1;User not found"; } $print_exec_time = false; break; // getUnread // getUnread case "digestTest": header("Content-Type: text/plain"); print_r(prepare_headlines_digest($link, $_SESSION["uid"])); $print_exec_time = false; break; // digestTest // digestTest case "digestSend": header("Content-Type: text/plain"); send_headlines_digests($link); $print_exec_time = false; break; // digestSend // digestSend case "getProfiles": $login = db_escape_string($_REQUEST["login"]); $password = db_escape_string($_REQUEST["password"]); if (authenticate_user($link, $login, $password)) { $result = db_query($link, "SELECT * FROM ttrss_settings_profiles\n\t\t\t\t\tWHERE owner_uid = " . $_SESSION["uid"] . " ORDER BY title"); print "<select style='width: 100%' name='profile'>"; print "<option value='0'>" . __("Default profile") . "</option>"; while ($line = db_fetch_assoc($result)) { $id = $line["id"]; $title = $line["title"]; print "<option value='{$id}'>{$title}</option>";
/** * Update a feed batch. * Used by daemons to update n feeds by run. * Only update feed needing a update, and not being processed * by another process. * * @param mixed $link Database link * @param integer $limit Maximum number of feeds in update batch. Default to DAEMON_FEED_LIMIT. * @param boolean $from_http Set to true if you call this function from http to disable cli specific code. * @param boolean $debug Set to false to disable debug output. Default to true. * @return void */ function update_daemon_common($link, $limit = DAEMON_FEED_LIMIT, $from_http = false, $debug = true) { // Process all other feeds using last_updated and interval parameters // Test if the user has loggued in recently. If not, it does not update its feeds. if (DAEMON_UPDATE_LOGIN_LIMIT > 0) { if (DB_TYPE == "pgsql") { $login_thresh_qpart = "AND ttrss_users.last_login >= NOW() - INTERVAL '" . DAEMON_UPDATE_LOGIN_LIMIT . " days'"; } else { $login_thresh_qpart = "AND ttrss_users.last_login >= DATE_SUB(NOW(), INTERVAL " . DAEMON_UPDATE_LOGIN_LIMIT . " DAY)"; } } else { $login_thresh_qpart = ""; } // Test if the feed need a update (update interval exceded). if (DB_TYPE == "pgsql") { $update_limit_qpart = "AND ((\n\t\t\t\t\tttrss_feeds.update_interval = 0\n\t\t\t\t\tAND ttrss_feeds.last_updated < NOW() - CAST((ttrss_user_prefs.value || ' minutes') AS INTERVAL)\n\t\t\t\t) OR (\n\t\t\t\t\tttrss_feeds.update_interval > 0\n\t\t\t\t\tAND ttrss_feeds.last_updated < NOW() - CAST((ttrss_feeds.update_interval || ' minutes') AS INTERVAL)\n\t\t\t\t) OR ttrss_feeds.last_updated IS NULL)"; } else { $update_limit_qpart = "AND ((\n\t\t\t\t\tttrss_feeds.update_interval = 0\n\t\t\t\t\tAND ttrss_feeds.last_updated < DATE_SUB(NOW(), INTERVAL CONVERT(ttrss_user_prefs.value, SIGNED INTEGER) MINUTE)\n\t\t\t\t) OR (\n\t\t\t\t\tttrss_feeds.update_interval > 0\n\t\t\t\t\tAND ttrss_feeds.last_updated < DATE_SUB(NOW(), INTERVAL ttrss_feeds.update_interval MINUTE)\n\t\t\t\t) OR ttrss_feeds.last_updated IS NULL)"; } // Test if feed is currently being updated by another process. if (DB_TYPE == "pgsql") { $updstart_thresh_qpart = "AND (ttrss_feeds.last_update_started IS NULL OR ttrss_feeds.last_update_started < NOW() - INTERVAL '120 seconds')"; } else { $updstart_thresh_qpart = "AND (ttrss_feeds.last_update_started IS NULL OR ttrss_feeds.last_update_started < DATE_SUB(NOW(), INTERVAL 120 SECOND))"; } // Test if there is a limit to number of updated feeds $query_limit = ""; if ($limit) { $query_limit = sprintf("LIMIT %d", $limit); } $random_qpart = sql_random_function(); // We search for feed needing update. $result = db_query($link, "SELECT ttrss_feeds.feed_url,ttrss_feeds.id, ttrss_feeds.owner_uid,\n\t\t\t\t" . SUBSTRING_FOR_DATE . "(ttrss_feeds.last_updated,1,19) AS last_updated,\n\t\t\t\tttrss_feeds.update_interval \n\t\t\tFROM \n\t\t\t\tttrss_feeds, ttrss_users, ttrss_user_prefs\n\t\t\tWHERE\n\t\t\t\tttrss_feeds.owner_uid = ttrss_users.id\n\t\t\t\tAND ttrss_users.id = ttrss_user_prefs.owner_uid\n\t\t\t\tAND ttrss_user_prefs.pref_name = 'DEFAULT_UPDATE_INTERVAL'\n\t\t\t\t{$login_thresh_qpart} {$update_limit_qpart}\n\t\t\t {$updstart_thresh_qpart}\n\t\t\tORDER BY {$random_qpart} {$query_limit}"); $user_prefs_cache = array(); if ($debug) { _debug(sprintf("Scheduled %d feeds to update...\n", db_num_rows($result))); } // Here is a little cache magic in order to minimize risk of double feed updates. $feeds_to_update = array(); while ($line = db_fetch_assoc($result)) { $feeds_to_update[$line['id']] = $line; } // We update the feed last update started date before anything else. // There is no lag due to feed contents downloads // It prevent an other process to update the same feed. $feed_ids = array_keys($feeds_to_update); if ($feed_ids) { db_query($link, sprintf("UPDATE ttrss_feeds SET last_update_started = NOW()\n\t\t\t\tWHERE id IN (%s)", implode(',', $feed_ids))); } // For each feed, we call the feed update function. while ($line = array_pop($feeds_to_update)) { 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["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?) } // Send feed digests by email if needed. if (DAEMON_SENDS_DIGESTS) { send_headlines_digests($link); } purge_orphans($link); }
function digestSend() { define('PREFS_NO_CACHE', true); send_headlines_digests($this->link); }