backend: merge with shared-feedbrowser

master
Andrew Dolgov 14 years ago
commit bf758124d2

@ -60,7 +60,7 @@
if (!($_SESSION["uid"] && validate_session($link)) && $op != "globalUpdateFeeds" && if (!($_SESSION["uid"] && validate_session($link)) && $op != "globalUpdateFeeds" &&
$op != "rss" && $op != "getUnread" && $op != "getProfiles" && $op != "rss" && $op != "getUnread" && $op != "getProfiles" &&
$op != "logout" && $op != "pubsub") { $op != "fbexport" && $op != "logout" && $op != "pubsub") {
header("Content-Type: text/plain"); header("Content-Type: text/plain");
print json_encode(array("error" => array("code" => 6))); print json_encode(array("error" => array("code" => 6)));
@ -121,6 +121,7 @@
require_once "modules/pref-filters.php"; require_once "modules/pref-filters.php";
require_once "modules/pref-labels.php"; require_once "modules/pref-labels.php";
require_once "modules/pref-users.php"; require_once "modules/pref-users.php";
require_once "modules/pref-instances.php";
$error = sanity_check($link); $error = sanity_check($link);
@ -435,6 +436,10 @@
module_pref_feed_browser($link); module_pref_feed_browser($link);
break; // pref-feed-browser break; // pref-feed-browser
case "pref-instances":
module_pref_instances($link);
break; // pref-instances
case "rss": case "rss":
$feed = db_escape_string($_REQUEST["id"]); $feed = db_escape_string($_REQUEST["id"]);
$key = db_escape_string($_REQUEST["key"]); $key = db_escape_string($_REQUEST["key"]);
@ -504,7 +509,7 @@
header("Content-type: text/html"); header("Content-type: text/html");
print __("Loading, please wait...") . " " . print __("Loading, please wait...") . " " .
"<img src='images/indicator_tiny.gif'>"; "<img src='images/indicator_tiny.gif'>";
break; break; // loading
case "getProfiles": case "getProfiles":
$login = db_escape_string($_REQUEST["login"]); $login = db_escape_string($_REQUEST["login"]);
@ -529,7 +534,7 @@
$_SESSION = array(); $_SESSION = array();
} }
break; break; // getprofiles
case "pubsub": case "pubsub":
$mode = db_escape_string($_REQUEST['hub_mode']); $mode = db_escape_string($_REQUEST['hub_mode']);
@ -571,17 +576,48 @@
header('HTTP/1.0 404 Not Found'); header('HTTP/1.0 404 Not Found');
} }
break; break; // pubsub
case "logout": case "logout":
logout_user(); logout_user();
header("Location: tt-rss.php"); 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: default:
header("Content-Type: text/plain"); header("Content-Type: text/plain");
print json_encode(array("error" => array("code" => 7))); print json_encode(array("error" => array("code" => 7)));
break; break; // fallback
} // Select action according to $op value. } // Select action according to $op value.
// We close the connection to database. // We close the connection to database.

@ -358,7 +358,7 @@
} }
} }
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); $login = urlencode($login);
$pass = urlencode($pass); $pass = urlencode($pass);
@ -374,6 +374,11 @@
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_ANY); 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) if ($login && $pass)
curl_setopt($ch, CURLOPT_USERPWD, "$login:$pass"); curl_setopt($ch, CURLOPT_USERPWD, "$login:$pass");
@ -7351,4 +7356,87 @@
return $query; 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'");
}
}
?> ?>

@ -834,6 +834,13 @@
return; return;
} }
if ($subop == "genHash") {
$hash = sha1(uniqid(rand(), true));
print json_encode(array("hash" => $hash));
return;
}
print json_encode(array("error" => array("code" => 7, print json_encode(array("error" => array("code" => 7,
"message" => "Unknown method: $subop"))); "message" => "Unknown method: $subop")));
} }

@ -990,6 +990,61 @@
type=\"submit\">". type=\"submit\">".
__('Close this window')."</button>"; __('Close this window')."</button>";
print "</div>"; 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>"; print "</dlg>";

@ -1539,11 +1539,21 @@
} }
if ($mode == 1) { 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 ttrss_feedbrowser_cache WHERE (SELECT COUNT(id) = 0 FROM ttrss_feeds AS tf
WHERE tf.feed_url = ttrss_feedbrowser_cache.feed_url WHERE tf.feed_url = ttrss_feedbrowser_cache.feed_url
AND owner_uid = '$owner_uid') $search_qpart 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) { } else if ($mode == 2) {
$result = db_query($link, "SELECT *, $result = db_query($link, "SELECT *,
(SELECT COUNT(*) FROM ttrss_user_entries WHERE (SELECT COUNT(*) FROM ttrss_user_entries WHERE
@ -1603,7 +1613,7 @@
$rv .= "<li title=\"".htmlspecialchars($details["site_url"])."\" $rv .= "<li title=\"".htmlspecialchars($details["site_url"])."\"
id=\"FBROW-".$details["id"]."\">$check_box". 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> "&nbsp;<span class='subscribers'>($subscribers)</span>
$site_url</li>"; $site_url</li>";

@ -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
}
?>

@ -5,6 +5,16 @@ var hotkey_prefix_pressed = false;
var seq = ""; 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) { function feedlist_callback2(transport) {
try { try {
dijit.byId('feedConfigTab').attr('content', transport.responseText); 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) { function updateUsersList(sort_key) {
try { try {
@ -1760,3 +1778,160 @@ function insertSSLserial(value) {
exception_error("insertSSLcerial", e); 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]);
}

@ -103,7 +103,11 @@
<div id="userConfigTab" dojoType="dijit.layout.ContentPane" <div id="userConfigTab" dojoType="dijit.layout.ContentPane"
href="backend.php?op=pref-users" href="backend.php?op=pref-users"
title="<?php echo __('Users') ?>"></div> title="<?php echo __('Users') ?>"></div>
<div id="instanceConfigTab" dojoType="dijit.layout.ContentPane"
href="backend.php?op=pref-instances"
title="<?php echo __('Linked') ?>"></div>
<?php } ?> <?php } ?>
</div> </div>
<div id="footer" dojoType="dijit.layout.ContentPane" region="bottom"> <div id="footer" dojoType="dijit.layout.ContentPane" region="bottom">

@ -2,7 +2,7 @@
require_once "functions.php"; require_once "functions.php";
define('EXPECTED_CONFIG_VERSION', 22); define('EXPECTED_CONFIG_VERSION', 22);
define('SCHEMA_VERSION', 83); define('SCHEMA_VERSION', 84);
if (!file_exists("config.php")) { if (!file_exists("config.php")) {
print "<b>Fatal Error</b>: You forgot to copy print "<b>Fatal Error</b>: You forgot to copy

@ -1,6 +1,8 @@
SET NAMES utf8; SET NAMES utf8;
SET CHARACTER SET 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_access_keys;
drop table if exists ttrss_user_labels2; drop table if exists ttrss_user_labels2;
drop table if exists ttrss_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_user_prefs;
drop table if exists ttrss_prefs; drop table if exists ttrss_prefs;
drop table if exists ttrss_prefs_types; 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_tags;
drop table if exists ttrss_enclosures; drop table if exists ttrss_enclosures;
drop table if exists ttrss_settings_profiles; 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, twitter_oauth longtext default null,
index (theme_id)) TYPE=InnoDB DEFAULT CHARSET=UTF8; 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); 'SHA1:5baa61e4c9b93f3f0682250b6cf8331b7ee68fd8', 10);
create table ttrss_feed_categories(id integer not null primary key auto_increment, 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, create table ttrss_archived_feeds (id integer not null primary key,
owner_uid integer not null, owner_uid integer not null,
title varchar(200) not null, title varchar(200) not null,
feed_url text not null, feed_url text not null,
site_url varchar(250) not null default '', site_url varchar(250) not null default '',
index(owner_uid), index(owner_uid),
foreign key (owner_uid) references ttrss_users(id) ON DELETE CASCADE) TYPE=InnoDB DEFAULT CHARSET=UTF8; 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, create table ttrss_feeds (id integer not null auto_increment primary key,
owner_uid integer not null, owner_uid integer not null,
title varchar(200) not null, title varchar(200) not null,
cat_id integer default null, cat_id integer default null,
feed_url text not null, feed_url text not null,
icon_url varchar(250) not null default '', icon_url varchar(250) not null default '',
update_interval integer not null default 0, update_interval integer not null default 0,
purge_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 insert into ttrss_feeds (owner_uid, title, feed_url) values
(1, 'Tiny Tiny RSS: New Releases', 'http://tt-rss.org/releases.rss'); (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'); (1, 'Tiny Tiny RSS: Forum', 'http://tt-rss.org/forum/rss.php');
create table ttrss_entries (id integer not null primary key auto_increment, create table ttrss_entries (id integer not null primary key auto_increment,
title text not null, title text not null,
guid varchar(255) not null unique, guid varchar(255) not null unique,
link text not null, link text not null,
updated datetime not null, updated datetime not null,
content longtext not null, content longtext not null,
content_hash varchar(250) not null, content_hash varchar(250) not null,
no_orig_date bool not null default 0, 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 ( create table ttrss_user_entries (
int_id integer not null primary key auto_increment, int_id integer not null primary key auto_increment,
ref_id integer not null, ref_id integer not null,
feed_id int, feed_id int,
orig_feed_id int, orig_feed_id int,
owner_uid integer not null, owner_uid integer not null,
marked bool not null default 0, marked bool not null default 0,
published 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), index (owner_uid),
foreign key (owner_uid) references ttrss_users(id) ON DELETE CASCADE) TYPE=InnoDB DEFAULT CHARSET=UTF8; 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, create table ttrss_filter_types (id integer primary key,
name varchar(120) unique not null, name varchar(120) unique not null,
description varchar(250) not null unique) TYPE=InnoDB DEFAULT CHARSET=UTF8; 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 (1, 'title', 'Title');
insert into ttrss_filter_types (id,name,description) values (2, 'content', 'Content'); 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'); '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'); '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'); 'Article Date');
insert into ttrss_filter_types (id,name,description) values (6, 'author', 'Author'); 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'); insert into ttrss_filter_types (id,name,description) values (7, 'tag', 'Article Tags');
create table ttrss_filter_actions (id integer not null primary key, create table ttrss_filter_actions (id integer not null primary key,
name varchar(120) unique not null, name varchar(120) unique not null,
description varchar(250) not null unique) TYPE=InnoDB DEFAULT CHARSET=UTF8; 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'); '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'); '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'); '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'); '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'); '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'); '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'); 'Assign label');
create table ttrss_filters (id integer not null primary key auto_increment, 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, feed_id integer default null,
filter_type integer not null, filter_type integer not null,
reg_exp varchar(250) 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), index (action_id),
foreign key (action_id) references ttrss_filter_actions(id) ON DELETE CASCADE) TYPE=InnoDB DEFAULT CHARSET=UTF8; 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, create table ttrss_tags (id integer primary key auto_increment,
owner_uid integer not null, owner_uid integer not null,
tag_name varchar(250) not null, tag_name varchar(250) not null,
post_int_id integer not null, post_int_id integer not null,
index (post_int_id), 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; 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, create table ttrss_enclosures (id integer primary key auto_increment,
content_url text not null, content_url text not null,
@ -269,14 +271,14 @@ create table ttrss_settings_profiles(id integer primary key auto_increment,
index (owner_uid), index (owner_uid),
foreign key (owner_uid) references ttrss_users(id) ON DELETE CASCADE) TYPE=InnoDB DEFAULT CHARSET=UTF8; 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; 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 (1, 'bool');
insert into ttrss_prefs_types (id, type_name) values (2, 'string'); insert into ttrss_prefs_types (id, type_name) values (2, 'string');
insert into ttrss_prefs_types (id, type_name) values (3, 'integer'); 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; section_name varchar(100) not null) TYPE=InnoDB DEFAULT CHARSET=UTF8;
insert into ttrss_prefs_sections (id, section_name) values (1, 'General'); insert into ttrss_prefs_sections (id, section_name) values (1, 'General');
@ -394,25 +396,18 @@ create table ttrss_user_prefs (
index (pref_name), index (pref_name),
foreign key (pref_name) references ttrss_prefs(pref_name) ON DELETE CASCADE) TYPE=InnoDB DEFAULT CHARSET=UTF8; 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, create table ttrss_sessions (id varchar(250) unique not null primary key,
data text, data text,
expire integer not null, expire integer not null,
index (id), index (id),
index (expire)) TYPE=InnoDB DEFAULT CHARSET=UTF8; index (expire)) TYPE=InnoDB DEFAULT CHARSET=UTF8;
create table ttrss_feedbrowser_cache ( create table ttrss_feedbrowser_cache (
feed_url text not null, feed_url text not null,
title 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, owner_uid integer not null,
caption varchar(250) not null, caption varchar(250) not null,
fg_color varchar(15) not null default '', 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 foreign key (article_id) references ttrss_entries(id) ON DELETE CASCADE
) TYPE=InnoDB DEFAULT CHARSET=UTF8; ) 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, access_key varchar(250) not null,
feed_id varchar(250) not null, feed_id varchar(250) not null,
is_cat bool not null default false, is_cat bool not null default false,
owner_uid integer not null, owner_uid integer not null,
foreign key (owner_uid) references ttrss_users(id) ON DELETE CASCADE) TYPE=InnoDB DEFAULT CHARSET=UTF8; 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; commit;

@ -1,3 +1,5 @@
drop table ttrss_linked_feeds;
drop table ttrss_linked_instances;
drop table ttrss_access_keys; drop table ttrss_access_keys;
drop table ttrss_user_labels2; drop table ttrss_user_labels2;
drop table ttrss_labels2; drop table ttrss_labels2;
@ -10,7 +12,7 @@ drop table ttrss_filter_actions;
drop table ttrss_user_prefs; drop table ttrss_user_prefs;
drop table ttrss_prefs; drop table ttrss_prefs;
drop table ttrss_prefs_types; drop table ttrss_prefs_types;
drop table ttrss_prefs_sections; drop table ttrss_prefs_sections;
drop table ttrss_tags; drop table ttrss_tags;
drop table ttrss_enclosures; drop table ttrss_enclosures;
drop table ttrss_settings_profiles; drop table ttrss_settings_profiles;
@ -42,7 +44,7 @@ create table ttrss_users (id serial not null primary key,
twitter_oauth text default null, twitter_oauth text default null,
created timestamp 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); 'SHA1:5baa61e4c9b93f3f0682250b6cf8331b7ee68fd8', 10);
create table ttrss_feed_categories(id serial not null primary key, 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, create table ttrss_feeds (id serial not null primary key,
owner_uid integer not null references ttrss_users(id) on delete cascade, 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, 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 '', icon_url varchar(250) not null default '',
update_interval integer not null default 0, update_interval integer not null default 0,
purge_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, update_on_checksum_change boolean not null default false,
strip_images boolean not null default false, strip_images boolean not null default false,
pubsub_state integer not null default 0, 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); create index ttrss_feeds_owner_uid_index on ttrss_feeds(owner_uid);
insert into ttrss_feeds (owner_uid, title, feed_url) values insert into ttrss_feeds (owner_uid, title, feed_url) values
(1, 'Tiny Tiny RSS: New Releases', 'http://tt-rss.org/releases.rss'); (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'); (1, 'Tiny Tiny RSS: Forum', 'http://tt-rss.org/forum/rss.php');
create table ttrss_archived_feeds (id integer not null primary key, create table ttrss_archived_feeds (id integer not null primary key,
owner_uid integer not null references ttrss_users(id) on delete cascade, owner_uid integer not null references ttrss_users(id) on delete cascade,
title varchar(200) not null, title varchar(200) not null,
feed_url text not null, feed_url text not null,
site_url varchar(250) not null default ''); site_url varchar(250) not null default '');
create table ttrss_counters_cache ( create table ttrss_counters_cache (
feed_id integer not null, 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 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, create table ttrss_entries (id serial not null primary key,
title text not null, title text not null,
guid text not null unique, guid text not null unique,
link text not null, link text not null,
updated timestamp not null, updated timestamp not null,
content text not null, content text not null,
content_hash varchar(250) not null, content_hash varchar(250) not null,
no_orig_date boolean not null default false, 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 ( create table ttrss_user_entries (
int_id serial not null primary key, int_id serial not null primary key,
ref_id integer not null references ttrss_entries(id) ON DELETE CASCADE, ref_id integer not null references ttrss_entries(id) ON DELETE CASCADE,
feed_id int references ttrss_feeds(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, 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, owner_uid integer not null references ttrss_users(id) ON DELETE CASCADE,
marked boolean not null default false, marked boolean not null default false,
published 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, owner_uid integer not null references ttrss_users(id) ON DELETE CASCADE,
private boolean not null default false, private boolean not null default false,
date_entered timestamp not null); date_entered timestamp not null);
create index ttrss_entry_comments_ref_id_index on ttrss_entry_comments(ref_id); 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 index ttrss_entry_comments_owner_uid_index on ttrss_entry_comments(owner_uid);
create table ttrss_filter_types (id integer not null primary key, create table ttrss_filter_types (id integer not null primary key,
name varchar(120) unique not null, name varchar(120) unique not null,
description varchar(250) not null unique); 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 (1, 'title', 'Title');
insert into ttrss_filter_types (id,name,description) values (2, 'content', 'Content'); 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'); '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'); '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'); 'Article Date');
insert into ttrss_filter_types (id,name,description) values (6, 'author', 'Author'); 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'); insert into ttrss_filter_types (id,name,description) values (7, 'tag', 'Article Tags');
create table ttrss_filter_actions (id integer not null primary key, create table ttrss_filter_actions (id integer not null primary key,
name varchar(120) unique not null, name varchar(120) unique not null,
description varchar(250) not null unique); 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'); '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'); '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'); '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'); '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'); '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'); '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'); '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, owner_uid integer not null references ttrss_users(id) on delete cascade,
feed_id integer references ttrss_feeds(id) on delete cascade default null, 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, reg_exp varchar(250) not null,
filter_param varchar(250) not null default '', filter_param varchar(250) not null default '',
enabled boolean not null default true, 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_id integer not null default 1 references ttrss_filter_actions(id) on delete cascade,
action_param varchar(250) not null default ''); 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, tag_name varchar(250) not null,
owner_uid integer not null references ttrss_users(id) on delete cascade, 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); 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); 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, create table ttrss_enclosures (id serial not null primary key,
content_url text not null, 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, title varchar(250) not null,
owner_uid integer not null references ttrss_users(id) on delete cascade); 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); 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 (1, 'bool');
insert into ttrss_prefs_types (id, type_name) values (2, 'string'); insert into ttrss_prefs_types (id, type_name) values (2, 'string');
insert into ttrss_prefs_types (id, type_name) values (3, 'integer'); 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); section_name varchar(100) not null);
insert into ttrss_prefs_sections (id, section_name) values (1, 'General'); 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); 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('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_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); 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_owner_uid_index on ttrss_user_prefs(owner_uid);
-- create index ttrss_user_prefs_value_index on ttrss_user_prefs(value); -- 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, create table ttrss_sessions (id varchar(250) unique not null primary key,
data text, data text,
expire integer not null); expire integer not null);
create index ttrss_sessions_expire_index on ttrss_sessions(expire); 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 ( create table ttrss_feedbrowser_cache (
feed_url text not null primary key, feed_url text not null primary key,
title text not null, 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, owner_uid integer not null references ttrss_users(id) ON DELETE CASCADE,
fg_color varchar(15) not null default '', fg_color varchar(15) not null default '',
bg_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, is_cat boolean not null default false,
owner_uid integer not null references ttrss_users(id) on delete cascade); 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; commit;

@ -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;

@ -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;

@ -350,7 +350,11 @@ table.prefUserList tr.oddSelected,
table.prefFeedList tr.even, table.prefFeedList tr.even,
table.prefFeedList tr.odd, table.prefFeedList tr.odd,
table.prefFeedList tr.evenSelected, 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; cursor : pointer;
} }
@ -370,7 +374,11 @@ table.prefUserList tr.oddSelected:hover td,
table.prefFeedList tr.even:hover td, table.prefFeedList tr.even:hover td,
table.prefFeedList tr.odd:hover td, table.prefFeedList tr.odd:hover td,
table.prefFeedList tr.evenSelected: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; color : #88b0f0;
} }
@ -1472,13 +1480,14 @@ div#pref-tabs .dijitContentPane h3 {
#pref-filter-wrap, #pref-filter-header, #pref-filter-content, #pref-filter-wrap, #pref-filter-header, #pref-filter-content,
#pref-label-wrap, #pref-label-header, #pref-label-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; margin : 0px;
padding : 0px; padding : 0px;
border-width : 0px; border-width : 0px;
} }
#userConfigTab, #labelConfigTab, #filterConfigTab, #pref-feeds-feeds { #userConfigTab, #labelConfigTab, #filterConfigTab, #pref-feeds-feeds, #instanceConfigTab {
padding : 0px; padding : 0px;
} }

@ -22,6 +22,7 @@
print " -feedbrowser - update feedbrowser\n"; print " -feedbrowser - update feedbrowser\n";
print " -daemon - start single-process update daemon\n"; print " -daemon - start single-process update daemon\n";
print " -cleanup-tags - perform tags table maintenance\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"; print " -help - show this help\n";
return; return;
} }
@ -110,6 +111,10 @@
print "$rc tags deleted.\n"; print "$rc tags deleted.\n";
} }
if ($op == "-get-feeds") {
get_linked_feeds($link);
}
db_close($link); db_close($link);
unlink(LOCK_DIRECTORY . "/$lock_filename"); unlink(LOCK_DIRECTORY . "/$lock_filename");

@ -219,6 +219,9 @@
_debug("Cleaned $rc cached tags."); _debug("Cleaned $rc cached tags.");
_debug("Updating linked feeds...");
get_linked_feeds($link);
} }
_debug("Elapsed time: " . (time() - $start_timestamp) . " second(s)"); _debug("Elapsed time: " . (time() - $start_timestamp) . " second(s)");

Loading…
Cancel
Save