]> git.wh0rd.org - tt-rss.git/commitdiff
backend: merge with shared-feedbrowser
authorAndrew Dolgov <fox@madoka.volgo-balt.ru>
Wed, 20 Apr 2011 11:53:50 +0000 (15:53 +0400)
committerAndrew Dolgov <fox@madoka.volgo-balt.ru>
Wed, 20 Apr 2011 11:53:50 +0000 (15:53 +0400)
16 files changed:
backend.php
functions.php
modules/backend-rpc.php
modules/popup-dialog.php
modules/pref-feeds.php
modules/pref-instances.php [new file with mode: 0644]
prefs.js
prefs.php
sanity_check.php
schema/ttrss_schema_mysql.sql
schema/ttrss_schema_pgsql.sql
schema/versions/mysql/84.sql [new file with mode: 0644]
schema/versions/pgsql/84.sql [new file with mode: 0644]
tt-rss.css
update.php
update_daemon2.php

index 308ade0a727a44e1230f28e5d1f2e6c362dba61b..c4edd92eaa62849aa5f92a60e4fffd4f64d1a076 100644 (file)
@@ -60,7 +60,7 @@
 
        if (!($_SESSION["uid"] && validate_session($link)) && $op != "globalUpdateFeeds" &&
                        $op != "rss" && $op != "getUnread" && $op != "getProfiles" &&
-                       $op != "logout" && $op != "pubsub") {
+                       $op != "fbexport" && $op != "logout" && $op != "pubsub") {
 
                header("Content-Type: text/plain");
                print json_encode(array("error" => array("code" => 6)));
        require_once "modules/pref-filters.php";
        require_once "modules/pref-labels.php";
        require_once "modules/pref-users.php";
+       require_once "modules/pref-instances.php";
 
        $error = sanity_check($link);
 
                        module_pref_feed_browser($link);
                break; // pref-feed-browser
 
+               case "pref-instances":
+                       module_pref_instances($link);
+               break; // pref-instances
+
                case "rss":
                        $feed = db_escape_string($_REQUEST["id"]);
                        $key = db_escape_string($_REQUEST["key"]);
                        header("Content-type: text/html");
                        print __("Loading, please wait...") . " " .
                                "<img src='images/indicator_tiny.gif'>";
-               break;
+               break; // loading
 
                case "getProfiles":
                        $login = db_escape_string($_REQUEST["login"]);
 
                                $_SESSION = array();
                        }
-               break;
+               break; // getprofiles
 
                case "pubsub":
                        $mode = db_escape_string($_REQUEST['hub_mode']);
                                header('HTTP/1.0 404 Not Found');
                        }
 
-               break;
+               break; // pubsub
 
                case "logout":
                        logout_user();
                        header("Location: tt-rss.php");
-               break;
+               break; // logout
+
+               case "fbexport":
+
+                       // TODO: change to _POST
+                       $access_key = db_escape_string($_REQUEST["key"]);
+
+                       // TODO: rate limit checking using last_connected
+                       $result = db_query($link, "SELECT id FROM ttrss_linked_instances
+                               WHERE access_key = '$access_key'");
+
+                       if (db_num_rows($result) == 1) {
+
+                               $instance_id = db_fetch_result($result, 0, "id");
+
+                               $result = db_query($link, "SELECT feed_url, title, subscribers
+                                       FROM ttrss_feedbrowser_cache ORDER BY subscribers DESC LIMIT 100");
+
+                               $feeds = array();
+
+                               while ($line = db_fetch_assoc($result)) {
+                                       array_push($feeds, $line);
+                               }
+
+                               db_query($link, "UPDATE ttrss_linked_instances SET last_connected = NOW(),
+                                       last_status_in = 1 WHERE id = '$instance_id'");
+
+                               print json_encode(array("feeds" => $feeds));
+                       } else {
+                               print json_encode(array("error" => array("code" => 6)));
+                       }
+               break; // fbexport
 
                default:
                        header("Content-Type: text/plain");
                        print json_encode(array("error" => array("code" => 7)));
-               break;
+               break; // fallback
        } // Select action according to $op value.
 
        // We close the connection to database.
index 0da69094af03060933f4678aca48d416a071ace7..7fd9df780a3a3a0b11f3212321e3fc5018b86a95 100644 (file)
                }
        }
 
-       function fetch_file_contents($url, $type = false, $login = false, $pass = false) {
+       function fetch_file_contents($url, $type = false, $login = false, $pass = false, $post_query = false) {
                $login = urlencode($login);
                $pass = urlencode($pass);
 
                        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
                        curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_ANY);
 
+                       if ($post_query) {
+                               curl_setopt($ch, CURLOPT_POST, true);
+                               curl_setopt($ch, CURLOPT_POSTFIELDS, $post_query);
+                       }
+
                        if ($login && $pass)
                                curl_setopt($ch, CURLOPT_USERPWD, "$login:$pass");
 
 
                return $query;
        }
+
+       // 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'] . '/backend.php?op=fbexport';
+                       $post_query = 'key=' . $line['access_key'];
+
+                       $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;
+                                       } 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']);
+
+                                                               db_query($link, "INSERT INTO ttrss_linked_feeds
+                                                                       (feed_url, title, subscribers, instance_id, created, updated)
+                                                               VALUES
+                                                                       ('$feed_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'");
+
+               }
+
+       }
 ?>
index f21ca5814033b86aab80a6054b4ea2760c0e9e5a..75ce6886a0952c6058db837d28df0a3bf94f4040 100644 (file)
                        return;
                }
 
+               if ($subop == "genHash") {
+                       $hash = sha1(uniqid(rand(), true));
+
+                       print json_encode(array("hash" => $hash));
+                       return;
+               }
+
                print json_encode(array("error" => array("code" => 7,
                        "message" => "Unknown method: $subop")));
        }
index 2eb63af9dd166d613634094681704a50234ab06c..6cb60eef43fa53edbdb06ade74309e202978c48a 100644 (file)
                                type=\"submit\">".
                                __('Close this window')."</button>";
                        print "</div>";
+               }
+
+               if ($id == "addInstance") {
+
+                       print "<input dojoType=\"dijit.form.TextBox\" style=\"display : none\"  name=\"op\" value=\"pref-instances\">";
+                       print "<input dojoType=\"dijit.form.TextBox\" style=\"display : none\"  name=\"subop\" value=\"add\">";
+
+                       print "<div class=\"dlgSec\">".__("Instance")."</div>";
+
+                       print "<div class=\"dlgSecCont\">";
+
+                       /* URL */
+
+                       print __("URL:") . " ";
+
+                       print "<input dojoType=\"dijit.form.ValidationTextBox\" required=\"1\"
+                               placeHolder=\"".__("Instance URL")."\"
+                               regExp='^(http|https)://.*'
+                               style=\"font-size : 16px; width: 20em\" name=\"access_url\">";
+
+                       print "<hr/>";
+
+                       $access_key = sha1(uniqid(rand(), true));
+
+                       /* Access key */
+
+                       print __("Access key:") . " ";
+
+                       print "<input dojoType=\"dijit.form.ValidationTextBox\" required=\"1\"
+                               placeHolder=\"".__("Access key")."\" regExp='\w{40}'
+                               style=\"width: 20em\" name=\"access_key\" id=\"instance_add_key\"
+                               value=\"$access_key\">";
+
+                       print "<p class='insensitive'>" . __("Use one access key for both linked instances.");
+
+                       print "</div>";
+
+                       print "<div class=\"dlgButtons\">
+                               <div style='float : left'>
+                                       <button dojoType=\"dijit.form.Button\"
+                                               onclick=\"return dijit.byId('instanceAddDlg').regenKey()\">".
+                                               __('Generate new key')."</button>
+                               </div>
+                               <button dojoType=\"dijit.form.Button\"
+                                       onclick=\"return dijit.byId('instanceAddDlg').execute()\">".
+                                       __('Create link')."</button>
+                               <button dojoType=\"dijit.form.Button\"
+                                       onclick=\"return dijit.byId('instanceAddDlg').hide()\"\">".
+                                       __('Cancel')."</button></div>";
+
+                       return;
+
+
+
+
                }
 
                print "</dlg>";
index f496c782f278cbf154447cf24a918a93d35edbea..4baba572a77e546741196ec81e9d2d3bde6d5718 100644 (file)
                        }
 
                        if ($mode == 1) {
-                               $result = db_query($link, "SELECT feed_url, subscribers FROM
+                               /* $result = db_query($link, "SELECT feed_url, subscribers FROM
                                        ttrss_feedbrowser_cache WHERE (SELECT COUNT(id) = 0 FROM ttrss_feeds AS tf
                                        WHERE tf.feed_url = ttrss_feedbrowser_cache.feed_url
                                        AND owner_uid = '$owner_uid') $search_qpart
-                                       ORDER BY subscribers DESC LIMIT $limit");
+                                       ORDER BY subscribers DESC LIMIT $limit"); */
+
+                               $result = db_query($link, "SELECT feed_url, title, SUM(subscribers) AS subscribers FROM
+                                       (SELECT feed_url, title, subscribers FROM ttrss_feedbrowser_cache UNION ALL
+                                               SELECT feed_url, title, subscribers FROM ttrss_linked_feeds) AS qqq
+                                       WHERE
+                                               (SELECT COUNT(id) = 0 FROM ttrss_feeds AS tf
+                                                       WHERE tf.feed_url = qqq.feed_url
+                                                               AND owner_uid = '$owner_uid') $search_qpart
+                                       GROUP BY feed_url, title ORDER BY subscribers DESC LIMIT $limit");
+
                        } else if ($mode == 2) {
                                $result = db_query($link, "SELECT *,
                                        (SELECT COUNT(*) FROM ttrss_user_entries WHERE
 
                                        $rv .= "<li title=\"".htmlspecialchars($details["site_url"])."\"
                                                id=\"FBROW-".$details["id"]."\">$check_box".
-                                               "$feed_icon $feed_url " . htmlspecialchars($details["title"]) .
+                                               "$feed_icon $feed_url " . htmlspecialchars($line["title"]) .
                                                "&nbsp;<span class='subscribers'>($subscribers)</span>
                                                $site_url</li>";
 
diff --git a/modules/pref-instances.php b/modules/pref-instances.php
new file mode 100644 (file)
index 0000000..d3510c2
--- /dev/null
@@ -0,0 +1,193 @@
+<?php
+       function module_pref_instances($link) {
+
+               $subop = $_REQUEST['subop'];
+
+               if ($subop == "remove") {
+                       $ids = db_escape_string($_REQUEST['ids']);
+
+                       db_query($link, "DELETE FROM ttrss_linked_instances WHERE
+                               id IN ($ids)");
+
+                       return;
+               }
+
+               if ($subop == "add") {
+                       $id = db_escape_string($_REQUEST["id"]);
+                       $access_url = db_escape_string($_REQUEST["access_url"]);
+                       $access_key = db_escape_string($_REQUEST["access_key"]);
+
+                       db_query($link, "BEGIN");
+
+                       $result = db_query($link, "SELECT id FROM ttrss_linked_instances
+                               WHERE access_url = '$access_url'");
+
+                       if (db_num_rows($result) == 0) {
+                               db_query($link, "INSERT INTO ttrss_linked_instances
+                                       (access_url, access_key, last_connected, last_status_in, last_status_out)
+                                       VALUES
+                                       ('$access_url', '$access_key', '1970-01-01', -1, -1)");
+
+                       }
+
+                       db_query($link, "COMMIT");
+
+                       return;
+               }
+
+               if ($subop == "edit") {
+
+                       $id = db_escape_string($_REQUEST["id"]);
+
+                       $result = db_query($link, "SELECT * FROM ttrss_linked_instances WHERE
+                               id = '$id'");
+
+                       print "<input dojoType=\"dijit.form.TextBox\" style=\"display : none\"  name=\"id\" value=\"$id\">";
+                       print "<input dojoType=\"dijit.form.TextBox\" style=\"display : none\"  name=\"op\" value=\"pref-instances\">";
+                       print "<input dojoType=\"dijit.form.TextBox\" style=\"display : none\"  name=\"subop\" value=\"editSave\">";
+
+                       print "<div class=\"dlgSec\">".__("Instance")."</div>";
+
+                       print "<div class=\"dlgSecCont\">";
+
+                       /* URL */
+
+                       $access_url = htmlspecialchars(db_fetch_result($result, 0, "access_url"));
+
+                       print __("URL:") . " ";
+
+                       print "<input dojoType=\"dijit.form.ValidationTextBox\" required=\"1\"
+                               placeHolder=\"".__("Instance URL")."\"
+                               regExp='^(http|https)://.*'
+                               style=\"font-size : 16px; width: 20em\" name=\"access_url\"
+                               value=\"$access_url\">";
+
+                       print "<hr/>";
+
+                       $access_key = htmlspecialchars(db_fetch_result($result, 0, "access_key"));
+
+                       /* Access key */
+
+                       print __("Access key:") . " ";
+
+                       print "<input dojoType=\"dijit.form.ValidationTextBox\" required=\"1\"
+                               placeHolder=\"".__("Access key")."\" regExp='\w{40}'
+                               style=\"width: 20em\" name=\"access_key\" id=\"instance_edit_key\"
+                               value=\"$access_key\">";
+
+                       print "<p class='insensitive'>" . __("Use one access key for both linked instances.");
+
+                       print "</div>";
+
+                       print "<div class=\"dlgButtons\">
+                               <div style='float : left'>
+                                       <button dojoType=\"dijit.form.Button\"
+                                               onclick=\"return dijit.byId('instanceEditDlg').regenKey()\">".
+                                               __('Generate new key')."</button>
+                               </div>
+                               <button dojoType=\"dijit.form.Button\"
+                                       onclick=\"return dijit.byId('instanceEditDlg').execute()\">".
+                                       __('Save')."</button>
+                               <button dojoType=\"dijit.form.Button\"
+                                       onclick=\"return dijit.byId('instanceEditDlg').hide()\"\">".
+                                       __('Cancel')."</button></div>";
+
+                       return;
+               }
+
+               if ($subop == "editSave") {
+                       $id = db_escape_string($_REQUEST["id"]);
+                       $access_url = db_escape_string($_REQUEST["access_url"]);
+                       $access_key = db_escape_string($_REQUEST["access_key"]);
+
+                       db_query($link, "UPDATE ttrss_linked_instances SET
+                               access_key = '$access_key', access_url = '$access_url',
+                               last_connected = '1970-01-01'
+                               WHERE id = '$id'");
+
+                       return;
+               }
+
+               print "<div id=\"pref-instance-wrap\" dojoType=\"dijit.layout.BorderContainer\" gutters=\"false\">";
+               print "<div id=\"pref-instance-header\" dojoType=\"dijit.layout.ContentPane\" region=\"top\">";
+
+               print "<div id=\"pref-instance-toolbar\" dojoType=\"dijit.Toolbar\">";
+
+               $sort = db_escape_string($_REQUEST["sort"]);
+
+               if (!$sort || $sort == "undefined") {
+                       $sort = "access_url";
+               }
+
+               print "<div dojoType=\"dijit.form.DropDownButton\">".
+                               "<span>" . __('Select')."</span>";
+               print "<div dojoType=\"dijit.Menu\" style=\"display: none;\">";
+               print "<div onclick=\"selectTableRows('prefInstanceList', 'all')\"
+                       dojoType=\"dijit.MenuItem\">".__('All')."</div>";
+               print "<div onclick=\"selectTableRows('prefInstanceList', 'none')\"
+                       dojoType=\"dijit.MenuItem\">".__('None')."</div>";
+               print "</div></div>";
+
+               print "<button dojoType=\"dijit.form.Button\" onclick=\"addInstance()\">".__('Link instance')."</button>";
+               print "<button dojoType=\"dijit.form.Button\" onclick=\"editSelectedInstance()\">".__('Edit')."</button>";
+               print "<button dojoType=\"dijit.form.Button\" onclick=\"removeSelectedInstances()\">".__('Remove')."</button>";
+
+               print "</div>"; #toolbar
+
+               $result = db_query($link, "SELECT *,
+                       (SELECT COUNT(*) FROM ttrss_linked_feeds
+                               WHERE instance_id = ttrss_linked_instances.id) AS num_feeds
+                       FROM ttrss_linked_instances
+                       ORDER BY $sort");
+
+               print "<p class=\"insensitive\" style='margin-left : 1em;'>" . __("You can connect other instances of Tiny Tiny RSS to this one to share Popular feeds. Link to this instance of Tiny Tiny RSS by using this URL:");
+
+               print " <a href=\"#\" onclick=\"alert('".htmlspecialchars(get_self_url_prefix())."')\">(display url)</a>";
+
+               print "<p><table width='100%' id='prefInstanceList' class='prefInstanceList' cellspacing='0'>";
+
+               print "<tr class=\"title\">
+                       <td align='center' width=\"5%\">&nbsp;</td>
+                       <td width=''><a href=\"#\" onclick=\"updateInstanceList('access_url')\">".__('Instance URL')."</a></td>
+                       <td width='20%'><a href=\"#\" onclick=\"updateInstanceList('access_key')\">".__('Access key')."</a></td>
+                       <td width='10%'><a href=\"#\" onclick=\"updateUsersList('last_connected')\">".__('Last connected')."</a></td>
+                       <td width='10%'><a href=\"#\" onclick=\"updateUsersList('num_feeds')\">".__('Stored feeds')."</a></td>
+                       </tr>";
+
+               $lnum = 0;
+
+               while ($line = db_fetch_assoc($result)) {
+                       $class = ($lnum % 2) ? "even" : "odd";
+
+                       $id = $line['id'];
+                       $this_row_id = "id=\"LIRR-$id\"";
+
+                       $line["last_connected"] = make_local_datetime($link, $line["last_connected"], false);
+
+                       print "<tr class=\"$class\" $this_row_id>";
+
+                       print "<td align='center'><input onclick='toggleSelectRow(this);'
+                               type=\"checkbox\" id=\"LICHK-$id\"></td>";
+
+                       $onclick = "onclick='editInstance($id, event)' title='".__('Click to edit')."'";
+
+                       $access_key = mb_substr($line['access_key'], 0, 4) . '...' .
+                               mb_substr($line['access_key'], -4);
+
+                       print "<td $onclick>" . htmlspecialchars($line['access_url']) . "</td>";
+                       print "<td $onclick>" . htmlspecialchars($access_key) . "</td>";
+                       print "<td $onclick>" . htmlspecialchars($line['last_connected']) . "</td>";
+                       print "<td $onclick>" . htmlspecialchars($line['num_feeds']) . "</td>";
+
+                       print "</tr>";
+
+                       ++$lnum;
+               }
+
+               print "</table>";
+
+               print "</div>"; #pane
+               print "</div>"; #container
+
+       }
+?>
index 5d8cca38197591e49b0120bbd602883d871cdc5b..1cf2943293cd055ff538f05be2ce14adb6dd7215 100644 (file)
--- a/prefs.js
+++ b/prefs.js
@@ -5,6 +5,16 @@ var hotkey_prefix_pressed = false;
 
 var seq = "";
 
+function instancelist_callback2(transport) {
+       try {
+               dijit.byId('instanceConfigTab').attr('content', transport.responseText);
+               selectTab("instanceConfig", true);
+               notify("");
+       } catch (e) {
+               exception_error("instancelist_callback2", e);
+       }
+}
+
 function feedlist_callback2(transport) {
        try {
                dijit.byId('feedConfigTab').attr('content', transport.responseText);
@@ -66,6 +76,14 @@ function updateFeedList(sort_key) {
                } });
 }
 
+function updateInstanceList(sort_key) {
+       new Ajax.Request("backend.php", {
+               parameters: "?op=pref-instances&sort=" + param_escape(sort_key),
+               onComplete: function(transport) {
+                       instancelist_callback2(transport);
+               } });
+}
+
 function updateUsersList(sort_key) {
 
        try {
@@ -1760,3 +1778,160 @@ function insertSSLserial(value) {
                exception_error("insertSSLcerial", e);
        }
 }
+
+function getSelectedInstances() {
+       return getSelectedTableRowIds("prefInstanceList");
+}
+
+function addInstance() {
+       try {
+               var query = "backend.php?op=dlg&id=addInstance";
+
+               if (dijit.byId("instanceAddDlg"))
+                       dijit.byId("instanceAddDlg").destroyRecursive();
+
+               dialog = new dijit.Dialog({
+                       id: "instanceAddDlg",
+                       title: __("Link Instance"),
+                       style: "width: 600px",
+                       regenKey: function() {
+                               new Ajax.Request("backend.php", {
+                                       parameters: "?op=rpc&subop=genHash",
+                                       onComplete: function(transport) {
+                                               var reply = JSON.parse(transport.responseText);
+                                               if (reply)
+                                                       dijit.byId('instance_add_key').attr('value', reply.hash);
+
+                                       } });
+                       },
+                       execute: function() {
+                               if (this.validate()) {
+                                       console.warn(dojo.objectToQuery(this.attr('value')));
+
+                                       notify_progress('Saving data...', true);
+                                       new Ajax.Request("backend.php", {
+                                               parameters: dojo.objectToQuery(this.attr('value')),
+                                               onComplete: function(transport) {
+                                                       dialog.hide();
+                                                       notify('');
+                                                       updateInstanceList();
+                                       } });
+                               }
+                       },
+                       href: query,
+               });
+
+               dialog.show();
+
+       } catch (e) {
+               exception_error("addInstance", e);
+       }
+}
+
+function editInstance(id, event) {
+       try {
+               if (!event || !event.ctrlKey) {
+
+               selectTableRows('prefInstanceList', 'none');
+               selectTableRowById('LIRR-'+id, 'LICHK-'+id, true);
+
+               var query = "backend.php?op=pref-instances&subop=edit&id=" +
+                       param_escape(id);
+
+               if (dijit.byId("instanceEditDlg"))
+                       dijit.byId("instanceEditDlg").destroyRecursive();
+
+               dialog = new dijit.Dialog({
+                       id: "instanceEditDlg",
+                       title: __("Edit Instance"),
+                       style: "width: 600px",
+                       regenKey: function() {
+                               new Ajax.Request("backend.php", {
+                                       parameters: "?op=rpc&subop=genHash",
+                                       onComplete: function(transport) {
+                                               var reply = JSON.parse(transport.responseText);
+                                               if (reply)
+                                                       dijit.byId('instance_edit_key').attr('value', reply.hash);
+
+                                       } });
+                       },
+                       execute: function() {
+                               if (this.validate()) {
+//                                     console.warn(dojo.objectToQuery(this.attr('value')));
+
+                                       notify_progress('Saving data...', true);
+                                       new Ajax.Request("backend.php", {
+                                               parameters: dojo.objectToQuery(this.attr('value')),
+                                               onComplete: function(transport) {
+                                                       dialog.hide();
+                                                       notify('');
+                                                       updateInstanceList();
+                                       } });
+                               }
+                       },
+                       href: query,
+               });
+
+               dialog.show();
+
+               } else if (event.ctrlKey) {
+                       var cb = $('LICHK-' + id);
+                       cb.checked = !cb.checked;
+                       toggleSelectRow(cb);
+               }
+
+
+       } catch (e) {
+               exception_error("editInstance", e);
+       }
+}
+
+function removeSelectedInstances() {
+       try {
+               var sel_rows = getSelectedInstances();
+
+               if (sel_rows.length > 0) {
+
+                       var ok = confirm(__("Remove selected instances?"));
+
+                       if (ok) {
+                               notify_progress("Removing selected instances...");
+
+                               var query = "?op=pref-instances&subop=remove&ids="+
+                                       param_escape(sel_rows.toString());
+
+                               new Ajax.Request("backend.php", {
+                                       parameters: query,
+                                       onComplete: function(transport) {
+                                               notify('');
+                                               updateInstanceList();
+                                       } });
+                       }
+
+               } else {
+                       alert(__("No instances are selected."));
+               }
+
+       } catch (e) {
+               exception_error("removeInstance", e);
+       }
+}
+
+function editSelectedInstance() {
+       var rows = getSelectedInstances();
+
+       if (rows.length == 0) {
+               alert(__("No instances are selected."));
+               return;
+       }
+
+       if (rows.length > 1) {
+               alert(__("Please select only one instance."));
+               return;
+       }
+
+       notify("");
+
+       editInstance(rows[0]);
+}
+
index 5b70b2cad214f0eb0a445746ee7d7e6226e7d5be..11dab397706556c25bc75bbaa2b59c69e62a5450 100644 (file)
--- a/prefs.php
+++ b/prefs.php
        <div id="userConfigTab" dojoType="dijit.layout.ContentPane"
                href="backend.php?op=pref-users"
                title="<?php echo __('Users') ?>"></div>
+       <div id="instanceConfigTab" dojoType="dijit.layout.ContentPane"
+               href="backend.php?op=pref-instances"
+               title="<?php echo __('Linked') ?>"></div>
 <?php } ?>
+
 </div>
 
 <div id="footer" dojoType="dijit.layout.ContentPane" region="bottom">
index ce755f4028b2fe9e0237e067c25496f4b4ecb382..9e4168b365d438e9dcfc75a6eb351f6379b78601 100644 (file)
@@ -2,7 +2,7 @@
        require_once "functions.php";
 
        define('EXPECTED_CONFIG_VERSION', 22);
-       define('SCHEMA_VERSION', 83);
+       define('SCHEMA_VERSION', 84);
 
        if (!file_exists("config.php")) {
                print "<b>Fatal Error</b>: You forgot to copy
index 0e17608731621c3ebdaa1134d4e417f18ac1ed47..a3a7b695bb7fc124c7b65df99e098f661cd4c9c1 100644 (file)
@@ -1,6 +1,8 @@
 SET NAMES utf8;
 SET CHARACTER SET utf8;
 
+drop table if exists ttrss_linked_feeds;
+drop table if exists ttrss_linked_instances;
 drop table if exists ttrss_access_keys;
 drop table if exists ttrss_user_labels2;
 drop table if exists ttrss_labels2;
@@ -13,7 +15,7 @@ drop table if exists ttrss_filter_actions;
 drop table if exists ttrss_user_prefs;
 drop table if exists ttrss_prefs;
 drop table if exists ttrss_prefs_types;
-drop table if exists ttrss_prefs_sections; 
+drop table if exists ttrss_prefs_sections;
 drop table if exists ttrss_tags;
 drop table if exists ttrss_enclosures;
 drop table if exists ttrss_settings_profiles;
@@ -46,7 +48,7 @@ create table ttrss_users (id integer primary key not null auto_increment,
        twitter_oauth longtext default null,
        index (theme_id)) TYPE=InnoDB DEFAULT CHARSET=UTF8;
 
-insert into ttrss_users (login,pwd_hash,access_level) values ('admin', 
+insert into ttrss_users (login,pwd_hash,access_level) values ('admin',
        'SHA1:5baa61e4c9b93f3f0682250b6cf8331b7ee68fd8', 10);
 
 create table ttrss_feed_categories(id integer not null primary key auto_increment,
@@ -59,8 +61,8 @@ create table ttrss_feed_categories(id integer not null primary key auto_incremen
 
 create table ttrss_archived_feeds (id integer not null primary key,
        owner_uid integer not null,
-       title varchar(200) not null, 
-       feed_url text not null, 
+       title varchar(200) not null,
+       feed_url text not null,
        site_url varchar(250) not null default '',
        index(owner_uid),
        foreign key (owner_uid) references ttrss_users(id) ON DELETE CASCADE) TYPE=InnoDB DEFAULT CHARSET=UTF8;
@@ -89,9 +91,9 @@ create index ttrss_cat_counters_cache_owner_uid_idx on ttrss_cat_counters_cache(
 
 create table ttrss_feeds (id integer not null auto_increment primary key,
        owner_uid integer not null,
-       title varchar(200) not null, 
+       title varchar(200) not null,
        cat_id integer default null,
-       feed_url text not null, 
+       feed_url text not null,
        icon_url varchar(250) not null default '',
        update_interval integer not null default 0,
        purge_interval integer not null default 0,
@@ -126,14 +128,14 @@ create table ttrss_feeds (id integer not null auto_increment primary key,
 insert into ttrss_feeds (owner_uid, title, feed_url) values
        (1, 'Tiny Tiny RSS: New Releases', 'http://tt-rss.org/releases.rss');
 
-insert into ttrss_feeds (owner_uid, title, feed_url) values 
+insert into ttrss_feeds (owner_uid, title, feed_url) values
        (1, 'Tiny Tiny RSS: Forum', 'http://tt-rss.org/forum/rss.php');
 
-create table ttrss_entries (id integer not null primary key auto_increment, 
-       title text not null, 
-       guid varchar(255) not null unique, 
-       link text not null, 
-       updated datetime not null, 
+create table ttrss_entries (id integer not null primary key auto_increment,
+       title text not null,
+       guid varchar(255) not null unique,
+       link text not null,
+       updated datetime not null,
        content longtext not null,
        content_hash varchar(250) not null,
        no_orig_date bool not null default 0,
@@ -150,8 +152,8 @@ create index ttrss_entries_updated_idx on ttrss_entries(updated);
 create table ttrss_user_entries (
        int_id integer not null primary key auto_increment,
        ref_id integer not null,
-       feed_id int, 
-       orig_feed_id int, 
+       feed_id int,
+       orig_feed_id int,
        owner_uid integer not null,
        marked bool not null default 0,
        published bool not null default 0,
@@ -182,48 +184,48 @@ create table ttrss_entry_comments (id integer not null primary key,
        index (owner_uid),
        foreign key (owner_uid) references ttrss_users(id) ON DELETE CASCADE) TYPE=InnoDB DEFAULT CHARSET=UTF8;
 
-create table ttrss_filter_types (id integer primary key, 
-       name varchar(120) unique not null, 
+create table ttrss_filter_types (id integer primary key,
+       name varchar(120) unique not null,
        description varchar(250) not null unique) TYPE=InnoDB DEFAULT CHARSET=UTF8;
 
 insert into ttrss_filter_types (id,name,description) values (1, 'title', 'Title');
 insert into ttrss_filter_types (id,name,description) values (2, 'content', 'Content');
-insert into ttrss_filter_types (id,name,description) values (3, 'both', 
+insert into ttrss_filter_types (id,name,description) values (3, 'both',
        'Title or Content');
-insert into ttrss_filter_types (id,name,description) values (4, 'link', 
+insert into ttrss_filter_types (id,name,description) values (4, 'link',
        'Link');
-insert into ttrss_filter_types (id,name,description) values (5, 'date', 
+insert into ttrss_filter_types (id,name,description) values (5, 'date',
        'Article Date');
 insert into ttrss_filter_types (id,name,description) values (6, 'author', 'Author');
 insert into ttrss_filter_types (id,name,description) values (7, 'tag', 'Article Tags');
 
-create table ttrss_filter_actions (id integer not null primary key, 
-       name varchar(120) unique not null, 
+create table ttrss_filter_actions (id integer not null primary key,
+       name varchar(120) unique not null,
        description varchar(250) not null unique) TYPE=InnoDB DEFAULT CHARSET=UTF8;
 
-insert into ttrss_filter_actions (id,name,description) values (1, 'filter', 
+insert into ttrss_filter_actions (id,name,description) values (1, 'filter',
        'Delete article');
 
-insert into ttrss_filter_actions (id,name,description) values (2, 'catchup', 
+insert into ttrss_filter_actions (id,name,description) values (2, 'catchup',
        'Mark as read');
 
-insert into ttrss_filter_actions (id,name,description) values (3, 'mark', 
+insert into ttrss_filter_actions (id,name,description) values (3, 'mark',
        'Set starred');
 
-insert into ttrss_filter_actions (id,name,description) values (4, 'tag', 
+insert into ttrss_filter_actions (id,name,description) values (4, 'tag',
        'Assign tags');
 
-insert into ttrss_filter_actions (id,name,description) values (5, 'publish', 
+insert into ttrss_filter_actions (id,name,description) values (5, 'publish',
        'Publish article');
 
-insert into ttrss_filter_actions (id,name,description) values (6, 'score', 
+insert into ttrss_filter_actions (id,name,description) values (6, 'score',
        'Modify score');
 
-insert into ttrss_filter_actions (id,name,description) values (7, 'label', 
+insert into ttrss_filter_actions (id,name,description) values (7, 'label',
        'Assign label');
 
 create table ttrss_filters (id integer not null primary key auto_increment,
-       owner_uid integer not null, 
+       owner_uid integer not null,
        feed_id integer default null,
        filter_type integer not null,
        reg_exp varchar(250) not null,
@@ -241,8 +243,8 @@ create table ttrss_filters (id integer not null primary key auto_increment,
        index (action_id),
        foreign key (action_id) references ttrss_filter_actions(id) ON DELETE CASCADE) TYPE=InnoDB DEFAULT CHARSET=UTF8;
 
-create table ttrss_tags (id integer primary key auto_increment, 
-       owner_uid integer not null, 
+create table ttrss_tags (id integer primary key auto_increment,
+       owner_uid integer not null,
        tag_name varchar(250) not null,
        post_int_id integer not null,
        index (post_int_id),
@@ -252,7 +254,7 @@ create table ttrss_tags (id integer primary key auto_increment,
 
 create table ttrss_version (schema_version int not null) TYPE=InnoDB DEFAULT CHARSET=UTF8;
 
-insert into ttrss_version values (83);
+insert into ttrss_version values (84);
 
 create table ttrss_enclosures (id integer primary key auto_increment,
        content_url text not null,
@@ -269,14 +271,14 @@ create table ttrss_settings_profiles(id integer primary key auto_increment,
        index (owner_uid),
        foreign key (owner_uid) references ttrss_users(id) ON DELETE CASCADE) TYPE=InnoDB DEFAULT CHARSET=UTF8;
 
-create table ttrss_prefs_types (id integer not null primary key, 
+create table ttrss_prefs_types (id integer not null primary key,
        type_name varchar(100) not null) TYPE=InnoDB DEFAULT CHARSET=UTF8;
 
 insert into ttrss_prefs_types (id, type_name) values (1, 'bool');
 insert into ttrss_prefs_types (id, type_name) values (2, 'string');
 insert into ttrss_prefs_types (id, type_name) values (3, 'integer');
 
-create table ttrss_prefs_sections (id integer not null primary key, 
+create table ttrss_prefs_sections (id integer not null primary key,
        section_name varchar(100) not null) TYPE=InnoDB DEFAULT CHARSET=UTF8;
 
 insert into ttrss_prefs_sections (id, section_name) values (1, 'General');
@@ -394,25 +396,18 @@ create table ttrss_user_prefs (
        index (pref_name),
        foreign key (pref_name) references ttrss_prefs(pref_name) ON DELETE CASCADE) TYPE=InnoDB DEFAULT CHARSET=UTF8;
 
-create table ttrss_scheduled_updates (id integer not null primary key auto_increment,
-       owner_uid integer not null,
-       feed_id integer default null,
-       entered datetime not null,
-       foreign key (owner_uid) references ttrss_users(id) ON DELETE CASCADE,
-       foreign key (feed_id) references ttrss_feeds(id) ON DELETE CASCADE) TYPE=InnoDB DEFAULT CHARSET=UTF8;
-
 create table ttrss_sessions (id varchar(250) unique not null primary key,
        data text,
        expire integer not null,
-       index (id), 
+       index (id),
        index (expire)) TYPE=InnoDB DEFAULT CHARSET=UTF8;
 
 create table ttrss_feedbrowser_cache (
        feed_url text not null,
        title text not null,
-       subscribers integer not null) DEFAULT CHARSET=UTF8;     
+       subscribers integer not null) DEFAULT CHARSET=UTF8;
 
-create table ttrss_labels2 (id integer not null primary key auto_increment, 
+create table ttrss_labels2 (id integer not null primary key auto_increment,
        owner_uid integer not null,
        caption varchar(250) not null,
        fg_color varchar(15) not null default '',
@@ -426,11 +421,27 @@ create table ttrss_user_labels2 (label_id integer not null,
        foreign key (article_id) references ttrss_entries(id) ON DELETE CASCADE
 ) TYPE=InnoDB DEFAULT CHARSET=UTF8;
 
-create table ttrss_access_keys (id serial not null primary key,
+create table ttrss_access_keys (id integer not null primary key auto_increment,
        access_key varchar(250) not null,
        feed_id varchar(250) not null,
        is_cat bool not null default false,
        owner_uid integer not null,
        foreign key (owner_uid) references ttrss_users(id) ON DELETE CASCADE) TYPE=InnoDB DEFAULT CHARSET=UTF8;
 
+create table ttrss_linked_instances (id integer not null primary key auto_increment,
+       last_connected datetime not null,
+       last_status_in integer not null,
+       last_status_out integer not null,
+       access_key varchar(250) not null,
+       access_url text not null) TYPE=InnoDB DEFAULT CHARSET=UTF8;
+
+create table ttrss_linked_feeds (
+       feed_url text not null,
+       title text not null,
+       created datetime not null,
+       updated datetime not null,
+       instance_id integer not null,
+       subscribers integer not null,
+       foreign key (instance_id) references ttrss_linked_instances(id) ON DELETE CASCADE) TYPE=InnoDB DEFAULT CHARSET=UTF8;
+
 commit;
index 5762134239d5dc6e153aefef9a8f9c640df85c66..1e60d3a1b257d5a63abe18c61f5210dfd76623d0 100644 (file)
@@ -1,3 +1,5 @@
+drop table ttrss_linked_feeds;
+drop table ttrss_linked_instances;
 drop table ttrss_access_keys;
 drop table ttrss_user_labels2;
 drop table ttrss_labels2;
@@ -10,7 +12,7 @@ drop table ttrss_filter_actions;
 drop table ttrss_user_prefs;
 drop table ttrss_prefs;
 drop table ttrss_prefs_types;
-drop table ttrss_prefs_sections; 
+drop table ttrss_prefs_sections;
 drop table ttrss_tags;
 drop table ttrss_enclosures;
 drop table ttrss_settings_profiles;
@@ -42,7 +44,7 @@ create table ttrss_users (id serial not null primary key,
        twitter_oauth text default null,
        created timestamp default null);
 
-insert into ttrss_users (login,pwd_hash,access_level) values ('admin', 
+insert into ttrss_users (login,pwd_hash,access_level) values ('admin',
        'SHA1:5baa61e4c9b93f3f0682250b6cf8331b7ee68fd8', 10);
 
 create table ttrss_feed_categories(id serial not null primary key,
@@ -53,9 +55,9 @@ create table ttrss_feed_categories(id serial not null primary key,
 
 create table ttrss_feeds (id serial not null primary key,
        owner_uid integer not null references ttrss_users(id) on delete cascade,
-       title varchar(200) not null, 
+       title varchar(200) not null,
        cat_id integer default null references ttrss_feed_categories(id) on delete set null,
-       feed_url text not null, 
+       feed_url text not null,
        icon_url varchar(250) not null default '',
        update_interval integer not null default 0,
        purge_interval integer not null default 0,
@@ -79,21 +81,21 @@ create table ttrss_feeds (id serial not null primary key,
        update_on_checksum_change boolean not null default false,
        strip_images boolean not null default false,
        pubsub_state integer not null default 0,
-       auth_pass_encrypted boolean not null default false);    
+       auth_pass_encrypted boolean not null default false);
 
 create index ttrss_feeds_owner_uid_index on ttrss_feeds(owner_uid);
 
 insert into ttrss_feeds (owner_uid, title, feed_url) values
        (1, 'Tiny Tiny RSS: New Releases', 'http://tt-rss.org/releases.rss');
 
-insert into ttrss_feeds (owner_uid, title, feed_url) values 
+insert into ttrss_feeds (owner_uid, title, feed_url) values
        (1, 'Tiny Tiny RSS: Forum', 'http://tt-rss.org/forum/rss.php');
 
 create table ttrss_archived_feeds (id integer not null primary key,
        owner_uid integer not null references ttrss_users(id) on delete cascade,
-       title varchar(200) not null, 
-       feed_url text not null, 
-       site_url varchar(250) not null default '');     
+       title varchar(200) not null,
+       feed_url text not null,
+       site_url varchar(250) not null default '');
 
 create table ttrss_counters_cache (
        feed_id integer not null,
@@ -113,11 +115,11 @@ create table ttrss_cat_counters_cache (
 
 create index ttrss_cat_counters_cache_owner_uid_idx on ttrss_cat_counters_cache(owner_uid);
 
-create table ttrss_entries (id serial not null primary key, 
-       title text not null, 
-       guid text not null unique, 
-       link text not null, 
-       updated timestamp not null, 
+create table ttrss_entries (id serial not null primary key,
+       title text not null,
+       guid text not null unique,
+       link text not null,
+       updated timestamp not null,
        content text not null,
        content_hash varchar(250) not null,
        no_orig_date boolean not null default false,
@@ -135,8 +137,8 @@ create index ttrss_entries_updated_idx on ttrss_entries(updated);
 create table ttrss_user_entries (
        int_id serial not null primary key,
        ref_id integer not null references ttrss_entries(id) ON DELETE CASCADE,
-       feed_id int references ttrss_feeds(id) ON DELETE CASCADE, 
-       orig_feed_id integer references ttrss_archived_feeds(id) ON DELETE SET NULL, 
+       feed_id int references ttrss_feeds(id) ON DELETE CASCADE,
+       orig_feed_id integer references ttrss_archived_feeds(id) ON DELETE SET NULL,
        owner_uid integer not null references ttrss_users(id) ON DELETE CASCADE,
        marked boolean not null default false,
        published boolean not null default false,
@@ -158,54 +160,54 @@ create table ttrss_entry_comments (id serial not null primary key,
        owner_uid integer not null references ttrss_users(id) ON DELETE CASCADE,
        private boolean not null default false,
        date_entered timestamp not null);
-       
+
 create index ttrss_entry_comments_ref_id_index on ttrss_entry_comments(ref_id);
 -- create index ttrss_entry_comments_owner_uid_index on ttrss_entry_comments(owner_uid);
 
-create table ttrss_filter_types (id integer not null primary key, 
-       name varchar(120) unique not null, 
+create table ttrss_filter_types (id integer not null primary key,
+       name varchar(120) unique not null,
        description varchar(250) not null unique);
 
 insert into ttrss_filter_types (id,name,description) values (1, 'title', 'Title');
 insert into ttrss_filter_types (id,name,description) values (2, 'content', 'Content');
-insert into ttrss_filter_types (id,name,description) values (3, 'both', 
+insert into ttrss_filter_types (id,name,description) values (3, 'both',
        'Title or Content');
-insert into ttrss_filter_types (id,name,description) values (4, 'link', 
+insert into ttrss_filter_types (id,name,description) values (4, 'link',
        'Link');
-insert into ttrss_filter_types (id,name,description) values (5, 'date', 
+insert into ttrss_filter_types (id,name,description) values (5, 'date',
        'Article Date');
 insert into ttrss_filter_types (id,name,description) values (6, 'author', 'Author');
 insert into ttrss_filter_types (id,name,description) values (7, 'tag', 'Article Tags');
 
-create table ttrss_filter_actions (id integer not null primary key, 
-       name varchar(120) unique not null, 
+create table ttrss_filter_actions (id integer not null primary key,
+       name varchar(120) unique not null,
        description varchar(250) not null unique);
 
-insert into ttrss_filter_actions (id,name,description) values (1, 'filter', 
+insert into ttrss_filter_actions (id,name,description) values (1, 'filter',
        'Delete article');
 
-insert into ttrss_filter_actions (id,name,description) values (2, 'catchup', 
+insert into ttrss_filter_actions (id,name,description) values (2, 'catchup',
        'Mark as read');
 
-insert into ttrss_filter_actions (id,name,description) values (3, 'mark', 
+insert into ttrss_filter_actions (id,name,description) values (3, 'mark',
        'Set starred');
 
-insert into ttrss_filter_actions (id,name,description) values (4, 'tag', 
+insert into ttrss_filter_actions (id,name,description) values (4, 'tag',
        'Assign tags');
 
-insert into ttrss_filter_actions (id,name,description) values (5, 'publish', 
+insert into ttrss_filter_actions (id,name,description) values (5, 'publish',
        'Publish article');
 
-insert into ttrss_filter_actions (id,name,description) values (6, 'score', 
+insert into ttrss_filter_actions (id,name,description) values (6, 'score',
        'Modify score');
 
-insert into ttrss_filter_actions (id,name,description) values (7, 'label', 
+insert into ttrss_filter_actions (id,name,description) values (7, 'label',
        'Assign label');
 
-create table ttrss_filters (id serial not null primary key,    
+create table ttrss_filters (id serial not null primary key,
        owner_uid integer not null references ttrss_users(id) on delete cascade,
        feed_id integer references ttrss_feeds(id) on delete cascade default null,
-       filter_type integer not null references ttrss_filter_types(id), 
+       filter_type integer not null references ttrss_filter_types(id),
        reg_exp varchar(250) not null,
        filter_param varchar(250) not null default '',
        enabled boolean not null default true,
@@ -213,7 +215,7 @@ create table ttrss_filters (id serial not null primary key,
        action_id integer not null default 1 references ttrss_filter_actions(id) on delete cascade,
        action_param varchar(250) not null default '');
 
-create table ttrss_tags (id serial not null primary key, 
+create table ttrss_tags (id serial not null primary key,
        tag_name varchar(250) not null,
        owner_uid integer not null references ttrss_users(id) on delete cascade,
        post_int_id integer references ttrss_user_entries(int_id) ON DELETE CASCADE not null);
@@ -223,7 +225,7 @@ create index ttrss_tags_post_int_id_idx on ttrss_tags(post_int_id);
 
 create table ttrss_version (schema_version int not null);
 
-insert into ttrss_version values (83);
+insert into ttrss_version values (84);
 
 create table ttrss_enclosures (id serial not null primary key,
        content_url text not null,
@@ -236,14 +238,14 @@ create table ttrss_settings_profiles(id serial not null primary key,
        title varchar(250) not null,
        owner_uid integer not null references ttrss_users(id) on delete cascade);
 
-create table ttrss_prefs_types (id integer not null primary key, 
+create table ttrss_prefs_types (id integer not null primary key,
        type_name varchar(100) not null);
 
 insert into ttrss_prefs_types (id, type_name) values (1, 'bool');
 insert into ttrss_prefs_types (id, type_name) values (2, 'string');
 insert into ttrss_prefs_types (id, type_name) values (3, 'integer');
 
-create table ttrss_prefs_sections (id integer not null primary key, 
+create table ttrss_prefs_sections (id integer not null primary key,
        section_name varchar(100) not null);
 
 insert into ttrss_prefs_sections (id, section_name) values (1, 'General');
@@ -259,7 +261,7 @@ create table ttrss_prefs (pref_name varchar(250) not null primary key,
        def_value text not null);
 
 insert into ttrss_prefs (pref_name,type_id,def_value,short_desc,section_id) values('PURGE_OLD_DAYS', 3, '60', 'Purge old posts after this number of days (0 - disables)',1);
-       
+
 insert into ttrss_prefs (pref_name,type_id,def_value,short_desc,section_id) values('DEFAULT_UPDATE_INTERVAL', 3, '30', 'Default interval between feed updates',1);
 
 insert into ttrss_prefs (pref_name,type_id,def_value,short_desc,section_id) values('DEFAULT_ARTICLE_LIMIT', 3, '30', 'Amount of articles to display at once',2);
@@ -355,13 +357,8 @@ create table ttrss_user_prefs (
 create index ttrss_user_prefs_owner_uid_index on ttrss_user_prefs(owner_uid);
 -- create index ttrss_user_prefs_value_index on ttrss_user_prefs(value);
 
-create table ttrss_scheduled_updates (id serial not null primary key,
-       owner_uid integer not null references ttrss_users(id) ON DELETE CASCADE,
-       feed_id integer default null references ttrss_feeds(id) ON DELETE CASCADE,
-       entered timestamp not null default NOW());
-
 create table ttrss_sessions (id varchar(250) unique not null primary key,
-       data text,      
+       data text,
        expire integer not null);
 
 create index ttrss_sessions_expire_index on ttrss_sessions(expire);
@@ -371,9 +368,9 @@ create function SUBSTRING_FOR_DATE(timestamp, int, int) RETURNS text AS 'SELECT
 create table ttrss_feedbrowser_cache (
        feed_url text not null primary key,
        title text not null,
-       subscribers integer not null);  
+       subscribers integer not null);
 
-create table ttrss_labels2 (id serial not null primary key, 
+create table ttrss_labels2 (id serial not null primary key,
        owner_uid integer not null references ttrss_users(id) ON DELETE CASCADE,
        fg_color varchar(15) not null default '',
        bg_color varchar(15) not null default '',
@@ -391,4 +388,19 @@ create table ttrss_access_keys (id serial not null primary key,
        is_cat boolean not null default false,
        owner_uid integer not null references ttrss_users(id) on delete cascade);
 
+create table ttrss_linked_instances (id serial not null primary key,
+       last_connected timestamp not null,
+       last_status_in integer not null,
+       last_status_out integer not null,
+       access_key varchar(250) not null,
+       access_url text not null);
+
+create table ttrss_linked_feeds (
+       feed_url text not null,
+       title text not null,
+       created timestamp not null,
+       updated timestamp not null,
+       instance_id integer not null references ttrss_linked_instances(id) ON DELETE CASCADE,
+       subscribers integer not null);
+
 commit;
diff --git a/schema/versions/mysql/84.sql b/schema/versions/mysql/84.sql
new file mode 100644 (file)
index 0000000..3255d6f
--- /dev/null
@@ -0,0 +1,23 @@
+begin;
+
+create table ttrss_linked_instances (id integer not null primary key auto_increment,
+       last_connected timestamp not null,
+       last_status_in integer not null,
+       last_status_out integer not null,
+       access_key varchar(250) not null,
+       access_url text not null) TYPE=InnoDB DEFAULT CHARSET=UTF8;
+
+create table ttrss_linked_feeds (
+       feed_url text not null,
+       title text not null,
+       created datetime not null,
+       updated datetime not null,
+       instance_id integer not null,
+       subscribers integer not null,
+       foreign key (instance_id) references ttrss_linked_instances(id) ON DELETE CASCADE) TYPE=InnoDB DEFAULT CHARSET=UTF8;
+
+drop table ttrss_scheduled_updates;
+
+update ttrss_version set schema_version = 84;
+
+commit;
diff --git a/schema/versions/pgsql/84.sql b/schema/versions/pgsql/84.sql
new file mode 100644 (file)
index 0000000..56c3359
--- /dev/null
@@ -0,0 +1,22 @@
+begin;
+
+create table ttrss_linked_instances (id serial not null primary key,
+       last_connected datetime not null,
+       last_status_in integer not null,
+       last_status_out integer not null,
+       access_key varchar(250) not null,
+       access_url text not null);
+
+create table ttrss_linked_feeds (
+       feed_url text not null,
+       title text not null,
+       created timestamp not null,
+       updated timestamp not null,
+       instance_id integer not null references ttrss_linked_instances(id) ON DELETE CASCADE,
+       subscribers integer not null);
+
+drop table ttrss_scheduled_updates;
+
+update ttrss_version set schema_version = 84;
+
+commit;
index 816832040ffd174b5b7af71ca398039b616fa87a..28c9e9a1dea24348c125efde4c074164ae83f008 100644 (file)
@@ -350,7 +350,11 @@ table.prefUserList tr.oddSelected,
 table.prefFeedList tr.even,
 table.prefFeedList tr.odd,
 table.prefFeedList tr.evenSelected,
-table.prefFeedList tr.oddSelected
+table.prefFeedList tr.oddSelected,
+table.prefInstanceList tr.even,
+table.prefInstanceList tr.odd,
+table.prefInstanceList tr.evenSelected,
+table.prefInstanceList tr.oddSelected
 {      
        cursor : pointer;
 }
@@ -370,7 +374,11 @@ table.prefUserList tr.oddSelected:hover td,
 table.prefFeedList tr.even:hover td, 
 table.prefFeedList tr.odd:hover td,
 table.prefFeedList tr.evenSelected:hover td, 
-table.prefFeedList tr.oddSelected:hover td
+table.prefFeedList tr.oddSelected:hover td,
+table.prefInstanceList tr.even:hover td, 
+table.prefInstanceList tr.odd:hover td,
+table.prefInstanceList tr.evenSelected:hover td, 
+table.prefInstanceList tr.oddSelected:hover td
 {
        color : #88b0f0;
 }
@@ -1472,13 +1480,14 @@ div#pref-tabs .dijitContentPane h3 {
 
 #pref-filter-wrap, #pref-filter-header, #pref-filter-content, 
 #pref-label-wrap, #pref-label-header, #pref-label-content,
-#pref-user-wrap, #pref-user-header, #pref-user-content {
+#pref-user-wrap, #pref-user-header, #pref-user-content, 
+#pref-instance-wrap, #pref-instance-header, #pref-instance-content {
        margin : 0px;
        padding : 0px;
        border-width : 0px;
 }
 
-#userConfigTab, #labelConfigTab, #filterConfigTab, #pref-feeds-feeds { 
+#userConfigTab, #labelConfigTab, #filterConfigTab, #pref-feeds-feeds, #instanceConfigTab { 
        padding : 0px;
 }
 
index 9c9c6ae8de742de18d06cd7b5c36638167e7f8f4..92e2ce6ef085c7090180a6286e0b53ae10ebaa6e 100755 (executable)
@@ -22,6 +22,7 @@
                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 "  -help          - show this help\n";
                return;
        }
                print "$rc tags deleted.\n";
        }
 
+       if ($op == "-get-feeds") {
+               get_linked_feeds($link);
+       }
+
        db_close($link);
 
        unlink(LOCK_DIRECTORY . "/$lock_filename");
index 6ccdbcb100e5a7fc2afd614563a1098159b92e76..9ad914307a0019ae122cca5d10e88d029c577c19 100755 (executable)
 
                                                _debug("Cleaned $rc cached tags.");
 
+                                               _debug("Updating linked feeds...");
+                                               get_linked_feeds($link);
+
                                        }
 
                                        _debug("Elapsed time: " . (time() - $start_timestamp) . " second(s)");