diff --git a/classes/pluginhost.php b/classes/pluginhost.php index e87f3a7e..c55667e1 100644 --- a/classes/pluginhost.php +++ b/classes/pluginhost.php @@ -12,6 +12,7 @@ class PluginHost { const HOOK_PREFS_SECTION = 4; const HOOK_PREFS_TABS = 5; const HOOK_FEED_PARSED = 6; + const HOOK_UPDATE_TASK = 7; function __construct($link) { $this->link = $link; diff --git a/include/functions.php b/include/functions.php index 6d82d803..8a3e07da 100644 --- a/include/functions.php +++ b/include/functions.php @@ -5013,101 +5013,6 @@ } } - // Status codes: - // -1 - never connected - // 0 - no data received - // 1 - data received successfully - // 2 - did not receive valid data - // >10 - server error, code + 10 (e.g. 16 means server error 6) - - function get_linked_feeds($link, $instance_id = false) { - if ($instance_id) - $instance_qpart = "id = '$instance_id' AND "; - else - $instance_qpart = ""; - - if (DB_TYPE == "pgsql") { - $date_qpart = "last_connected < NOW() - INTERVAL '6 hours'"; - } else { - $date_qpart = "last_connected < DATE_SUB(NOW(), INTERVAL 6 HOUR)"; - } - - $result = db_query($link, "SELECT id, access_key, access_url FROM ttrss_linked_instances - WHERE $instance_qpart $date_qpart ORDER BY last_connected"); - - while ($line = db_fetch_assoc($result)) { - $id = $line['id']; - - _debug("Updating: " . $line['access_url'] . " ($id)"); - - $fetch_url = $line['access_url'] . '/public.php?op=fbexport'; - $post_query = 'key=' . $line['access_key']; - - $feeds = fetch_file_contents($fetch_url, false, false, false, $post_query); - - // try doing it the old way - if (!$feeds) { - $fetch_url = $line['access_url'] . '/backend.php?op=fbexport'; - $feeds = fetch_file_contents($fetch_url, false, false, false, $post_query); - } - - if ($feeds) { - $feeds = json_decode($feeds, true); - - if ($feeds) { - if ($feeds['error']) { - $status = $feeds['error']['code'] + 10; - - // access denied - if ($status == 16) { - db_query($link, "DELETE FROM ttrss_linked_feeds - WHERE instance_id = '$id'"); - } - } else { - $status = 1; - - if (count($feeds['feeds']) > 0) { - - db_query($link, "DELETE FROM ttrss_linked_feeds - WHERE instance_id = '$id'"); - - foreach ($feeds['feeds'] as $feed) { - $feed_url = db_escape_string($feed['feed_url']); - $title = db_escape_string($feed['title']); - $subscribers = db_escape_string($feed['subscribers']); - $site_url = db_escape_string($feed['site_url']); - - db_query($link, "INSERT INTO ttrss_linked_feeds - (feed_url, site_url, title, subscribers, instance_id, created, updated) - VALUES - ('$feed_url', '$site_url', '$title', '$subscribers', '$id', NOW(), NOW())"); - } - } else { - // received 0 feeds, this might indicate that - // the instance on the other hand is rebuilding feedbrowser cache - // we will try again later - - // TODO: maybe perform expiration based on updated here? - } - - _debug("Processed " . count($feeds['feeds']) . " feeds."); - } - } else { - $status = 2; - } - - } else { - $status = 0; - } - - _debug("Status: $status"); - - db_query($link, "UPDATE ttrss_linked_instances SET - last_status_out = '$status', last_connected = NOW() WHERE id = '$id'"); - - } - } - function make_feed_browser($link, $search, $limit, $mode = 1) { $owner_uid = $_SESSION["uid"]; diff --git a/plugins/instances/instances.php b/plugins/instances/instances.php index c5d8067a..f95d511f 100644 --- a/plugins/instances/instances.php +++ b/plugins/instances/instances.php @@ -16,6 +16,113 @@ class Instances extends Plugin implements IHandler { $host->add_hook($host::HOOK_PREFS_TABS, $this); $host->add_handler("pref-instances", "*", $this); + $host->add_command("get-feeds", "receive popular feeds from linked instances", $this); + $host->add_hook($host::HOOK_UPDATE_TASK, $this); + } + + function hook_update_task($args) { + _debug("Get linked feeds..."); + $this->get_linked_feeds($this->link); + } + + // Status codes: + // -1 - never connected + // 0 - no data received + // 1 - data received successfully + // 2 - did not receive valid data + // >10 - server error, code + 10 (e.g. 16 means server error 6) + + function get_linked_feeds($link, $instance_id = false) { + if ($instance_id) + $instance_qpart = "id = '$instance_id' AND "; + else + $instance_qpart = ""; + + if (DB_TYPE == "pgsql") { + $date_qpart = "last_connected < NOW() - INTERVAL '6 hours'"; + } else { + $date_qpart = "last_connected < DATE_SUB(NOW(), INTERVAL 6 HOUR)"; + } + + $result = db_query($link, "SELECT id, access_key, access_url FROM ttrss_linked_instances + WHERE $instance_qpart $date_qpart ORDER BY last_connected"); + + while ($line = db_fetch_assoc($result)) { + $id = $line['id']; + + _debug("Updating: " . $line['access_url'] . " ($id)"); + + $fetch_url = $line['access_url'] . '/public.php?op=fbexport'; + $post_query = 'key=' . $line['access_key']; + + $feeds = fetch_file_contents($fetch_url, false, false, false, $post_query); + + // try doing it the old way + if (!$feeds) { + $fetch_url = $line['access_url'] . '/backend.php?op=fbexport'; + $feeds = fetch_file_contents($fetch_url, false, false, false, $post_query); + } + + if ($feeds) { + $feeds = json_decode($feeds, true); + + if ($feeds) { + if ($feeds['error']) { + $status = $feeds['error']['code'] + 10; + + // access denied + if ($status == 16) { + db_query($link, "DELETE FROM ttrss_linked_feeds + WHERE instance_id = '$id'"); + } + } else { + $status = 1; + + if (count($feeds['feeds']) > 0) { + + db_query($link, "DELETE FROM ttrss_linked_feeds + WHERE instance_id = '$id'"); + + foreach ($feeds['feeds'] as $feed) { + $feed_url = db_escape_string($feed['feed_url']); + $title = db_escape_string($feed['title']); + $subscribers = db_escape_string($feed['subscribers']); + $site_url = db_escape_string($feed['site_url']); + + db_query($link, "INSERT INTO ttrss_linked_feeds + (feed_url, site_url, title, subscribers, instance_id, created, updated) + VALUES + ('$feed_url', '$site_url', '$title', '$subscribers', '$id', NOW(), NOW())"); + } + } else { + // received 0 feeds, this might indicate that + // the instance on the other hand is rebuilding feedbrowser cache + // we will try again later + + // TODO: maybe perform expiration based on updated here? + } + + _debug("Processed " . count($feeds['feeds']) . " feeds."); + } + } else { + $status = 2; + } + + } else { + $status = 0; + } + + _debug("Status: $status"); + + db_query($link, "UPDATE ttrss_linked_instances SET + last_status_out = '$status', last_connected = NOW() WHERE id = '$id'"); + + } + } + + + function get_feeds() { + $this->get_linked_feeds($this->link, false); } function get_prefs_js() { diff --git a/update.php b/update.php index d039d062..f1396f6e 100755 --- a/update.php +++ b/update.php @@ -51,7 +51,6 @@ print " -feedbrowser - update feedbrowser\n"; print " -daemon - start single-process update daemon\n"; print " -cleanup-tags - perform tags table maintenance\n"; - print " -get-feeds - receive popular feeds from linked instances\n"; print " -import USER FILE - import articles from XML\n"; print " -quiet - don't show messages\n"; print " -indexes - recreate missing schema indexes\n"; @@ -98,7 +97,8 @@ $rc = cleanup_tags($link, 14, 50000); _debug("Cleaned $rc cached tags."); - get_linked_feeds($link); + global $pluginhost; + $pluginhost->run_hooks($pluginhost::HOOK_UPDATE_TASK, "hook_update_task", $op); } if (in_array("-feedbrowser", $op)) { @@ -135,7 +135,8 @@ _debug("Cleaned $rc cached tags."); - get_linked_feeds($link); + global $pluginhost; + $pluginhost->run_hooks($pluginhost::HOOK_UPDATE_TASK, "hook_update_task", $op); } } @@ -145,10 +146,6 @@ _debug("$rc tags deleted.\n"); } - if (in_array("-get-feeds", $op)) { - get_linked_feeds($link); - } - if (in_array("-import",$op)) { $username = $argv[count($argv) - 2]; $filename = $argv[count($argv) - 1]; diff --git a/update_daemon2.php b/update_daemon2.php index 3e66043a..04a7b0fc 100755 --- a/update_daemon2.php +++ b/update_daemon2.php @@ -206,9 +206,8 @@ _debug("Cleaned $rc cached tags."); - _debug("Updating linked feeds..."); - get_linked_feeds($link); - + global $pluginhost; + $pluginhost->run_hooks($pluginhost::HOOK_UPDATE_TASK, "hook_update_task", $op); } _debug("Elapsed time: " . (time() - $start_timestamp) . " second(s)");