From 905ff52a362b6afc28a2c3ed1cbc9b90d63253ba Mon Sep 17 00:00:00 2001 From: Andrew Dolgov Date: Wed, 10 Nov 2010 18:50:51 +0300 Subject: [PATCH] implement label cache; misc fixes (bump schema) --- backend.php | 4 ++ functions.php | 87 +++++++++++++++++++++++++++++------ modules/backend-rpc.php | 2 +- modules/pref-labels.php | 15 ++++++ sanity_check.php | 2 +- schema/ttrss_schema_mysql.sql | 3 +- schema/ttrss_schema_pgsql.sql | 3 +- viewfeed.js | 32 +++++-------- 8 files changed, 109 insertions(+), 39 deletions(-) diff --git a/backend.php b/backend.php index c19c3b9e..68187428 100644 --- a/backend.php +++ b/backend.php @@ -334,6 +334,8 @@ break; } + if ($_REQUEST["debug"]) $timing_info = print_checkpoint("04", $timing_info); + $ret = outputHeadlinesList($link, $feed, $subop, $view_mode, $limit, $cat_view, $next_unread_feed, $offset, $vgroup_last_feed, $override_order); @@ -346,6 +348,8 @@ print "]]>"; + if ($_REQUEST["debug"]) $timing_info = print_checkpoint("05", $timing_info); + //print ""; //print ""; diff --git a/functions.php b/functions.php index 9b695894..44d4ae20 100644 --- a/functions.php +++ b/functions.php @@ -1181,9 +1181,9 @@ $result = db_query($link, "INSERT INTO ttrss_user_entries (ref_id, owner_uid, feed_id, unread, last_read, marked, - published, score, tag_cache) + published, score, tag_cache, label_cache) VALUES ('$ref_id', '$owner_uid', '$feed', $unread, - $last_read_qpart, $marked, $published, '$score', '')"); + $last_read_qpart, $marked, $published, '$score', '', '')"); $result = db_query($link, "SELECT int_id FROM ttrss_user_entries WHERE @@ -5080,7 +5080,7 @@ $labels_str .= format_article_labels($labels, $id); $labels_str .= ""; - if (count($topmost_article_ids) < 5) { + if (count($topmost_article_ids) < 3) { array_push($topmost_article_ids, $id); } @@ -6089,14 +6089,6 @@ function get_article_labels($link, $id) { global $memcache; - $result = db_query($link, - "SELECT DISTINCT label_id,caption,fg_color,bg_color - FROM ttrss_labels2, ttrss_user_labels2 - WHERE id = label_id - AND article_id = '$id' - AND owner_uid = ".$_SESSION["uid"] . " - ORDER BY caption"); - $obj_id = md5("LABELS:$id:" . $_SESSION["uid"]); $rv = array(); @@ -6104,12 +6096,42 @@ if ($memcache && $obj = $memcache->get($obj_id)) { return $obj; } else { + + $result = db_query($link, "SELECT label_cache FROM + ttrss_user_entries WHERE ref_id = '$id' AND owner_uid = " . + $_SESSION["uid"]); + + $label_cache = db_fetch_result($result, 0, "label_cache"); + + if ($label_cache) { + + $label_cache = json_decode($label_cache, true); + + if ($label_cache["no-labels"] == 1) + return $rv; + else + return $label_cache; + } + + $result = db_query($link, + "SELECT DISTINCT label_id,caption,fg_color,bg_color + FROM ttrss_labels2, ttrss_user_labels2 + WHERE id = label_id + AND article_id = '$id' + AND owner_uid = ".$_SESSION["uid"] . " + ORDER BY caption"); + while ($line = db_fetch_assoc($result)) { $rk = array($line["label_id"], $line["caption"], $line["fg_color"], $line["bg_color"]); array_push($rv, $rk); } if ($memcache) $memcache->add($obj_id, $rv, 0, 3600); + + if (count($rv) > 0) + label_update_cache($link, $id, $rv); + else + label_update_cache($link, $id, array("no-labels" => 1)); } return $rv; @@ -6128,6 +6150,28 @@ } } + function label_update_cache($link, $id, $labels = false, $force = false) { + + if ($force) + label_clear_cache($link, $id); + + if (!$labels) + $labels = get_article_labels($link, $id); + + $labels = db_escape_string(json_encode($labels)); + + db_query($link, "UPDATE ttrss_user_entries SET + label_cache = '$labels' WHERE ref_id = '$id'"); + + } + + function label_clear_cache($link, $id) { + + db_query($link, "UPDATE ttrss_user_entries SET + label_cache = '' WHERE ref_id = '$id'"); + + } + function label_remove_article($link, $id, $label, $owner_uid) { $label_id = label_find_id($link, $label, $owner_uid); @@ -6139,6 +6183,8 @@ WHERE label_id = '$label_id' AND article_id = '$id'"); + + label_clear_cache($link, $id); } function label_add_article($link, $id, $label, $owner_uid) { @@ -6167,11 +6213,16 @@ db_query($link, "INSERT INTO ttrss_user_labels2 (label_id, article_id) VALUES ('$label_id', '$id')"); } + + label_clear_cache($link, $id); + } function label_remove($link, $id, $owner_uid) { global $memcache; + if (!$owner_uid) $owner_uid = $_SESSION["uid"]; + if ($memcache) { $obj_id = md5("LABELS:$id:$owner_uid"); $memcache->delete($obj_id); @@ -6185,7 +6236,7 @@ $caption = db_fetch_result($result, 0, "caption"); $result = db_query($link, "DELETE FROM ttrss_labels2 WHERE id = '$id' - AND owner_uid = " . $_SESSION["uid"]); + AND owner_uid = " . $owner_uid); if (db_affected_rows($link, $result) != 0 && $caption) { @@ -6201,8 +6252,14 @@ db_query($link, "UPDATE ttrss_filters SET enabled = false WHERE action_param = '$caption' AND action_id = 7 - AND owner_uid = " . $_SESSION["uid"]); - } + AND owner_uid = " . $owner_uid); + + /* Remove cached data */ + + db_query($link, "UPDATE ttrss_user_entries SET label_cache = '' + WHERE label_cache LIKE '%$caption%' AND owner_uid = " . $owner_uid); + + } db_query($link, "COMMIT"); } @@ -6938,7 +6995,7 @@ } } - if (db_num_rows($result) == 1) { + if (count($entries) == 1) { print __("Attachment:") . " "; } else { print __("Attachments:") . " "; diff --git a/modules/backend-rpc.php b/modules/backend-rpc.php index 047558fc..f28e7247 100644 --- a/modules/backend-rpc.php +++ b/modules/backend-rpc.php @@ -595,7 +595,7 @@ if ($subop == "removeFromLabel") { - $ids = split(",", db_escape_string($_REQUEST["ids"])); + $ids = explode(",", db_escape_string($_REQUEST["ids"])); $label_id = db_escape_string($_REQUEST["lid"]); $label = db_escape_string(label_find_caption($link, $label_id, diff --git a/modules/pref-labels.php b/modules/pref-labels.php index 73d6e583..884a25d1 100644 --- a/modules/pref-labels.php +++ b/modules/pref-labels.php @@ -21,6 +21,14 @@ fg_color = '$fg', bg_color = '$bg' WHERE id = '$id' AND owner_uid = " . $_SESSION["uid"]); } + + $caption = db_escape_string(label_find_caption($link, $id, $_SESSION["uid"])); + + /* Remove cached data */ + + db_query($link, "UPDATE ttrss_user_entries SET label_cache = '' + WHERE label_cache LIKE '%$caption%' AND owner_uid = " . $_SESSION["uid"]); + } return; @@ -33,6 +41,13 @@ db_query($link, "UPDATE ttrss_labels2 SET fg_color = '', bg_color = '' WHERE id = '$id' AND owner_uid = " . $_SESSION["uid"]); + + $caption = db_escape_string(label_find_caption($link, $id, $_SESSION["uid"])); + + /* Remove cached data */ + + db_query($link, "UPDATE ttrss_user_entries SET label_cache = '' + WHERE label_cache LIKE '%$caption%' AND owner_uid = " . $_SESSION["uid"]); } } diff --git a/sanity_check.php b/sanity_check.php index 79291ef3..7fc40447 100644 --- a/sanity_check.php +++ b/sanity_check.php @@ -2,7 +2,7 @@ require_once "functions.php"; define('EXPECTED_CONFIG_VERSION', 19); - define('SCHEMA_VERSION', 73); + define('SCHEMA_VERSION', 74); if (!file_exists("config.php")) { print "Fatal Error: You forgot to copy diff --git a/schema/ttrss_schema_mysql.sql b/schema/ttrss_schema_mysql.sql index e3408238..adf158c6 100644 --- a/schema/ttrss_schema_mysql.sql +++ b/schema/ttrss_schema_mysql.sql @@ -152,6 +152,7 @@ create table ttrss_user_entries ( marked bool not null default 0, published bool not null default 0, tag_cache text not null, + label_cache text not null, last_read datetime, score int not null default 0, note longtext, @@ -245,7 +246,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 (73); +insert into ttrss_version values (74); create table ttrss_enclosures (id integer primary key auto_increment, content_url text not null, diff --git a/schema/ttrss_schema_pgsql.sql b/schema/ttrss_schema_pgsql.sql index fc126500..152af5dd 100644 --- a/schema/ttrss_schema_pgsql.sql +++ b/schema/ttrss_schema_pgsql.sql @@ -138,6 +138,7 @@ create table ttrss_user_entries ( marked boolean not null default false, published boolean not null default false, tag_cache text not null, + label_cache text not null, last_read timestamp, score int not null default 0, note text, @@ -217,7 +218,7 @@ create index ttrss_tags_owner_uid_index on ttrss_tags(owner_uid); create table ttrss_version (schema_version int not null); -insert into ttrss_version values (73); +insert into ttrss_version values (74); create table ttrss_enclosures (id serial not null primary key, content_url text not null, diff --git a/viewfeed.js b/viewfeed.js index 5f510878..dbb5d77d 100644 --- a/viewfeed.js +++ b/viewfeed.js @@ -934,6 +934,8 @@ function selectionRemoveLabel(id) { var query = "?op=rpc&subop=removeFromLabel&ids=" + param_escape(ids.toString()) + "&lid=" + param_escape(id); + console.log(query); + // notify_progress("Loading, please wait..."); cache_invalidate("F:" + (-11 - id)); @@ -972,6 +974,8 @@ function selectionAssignLabel(id) { var query = "?op=rpc&subop=assignToLabel&ids=" + param_escape(ids.toString()) + "&lid=" + param_escape(id); + console.log(query); + // notify_progress("Loading, please wait..."); new Ajax.Request("backend.php", { @@ -1831,20 +1835,13 @@ function cache_expire() { var date = new Date(); var timestamp = Math.round(date.getTime() / 1000); - for (var id in cache_added) { - var tmp = []; - - var key_id = id.replace("TS:", ""); + for (var i = 0; i < localStorage.length; i++) { - //console.warn("CEXP:" + key_id); + var id = localStorage.key(i); - if (timestamp - cache_added[id] > 180) { - cache_invalidate(key_id); - } else { - tmp[id] = cache_added[id]; + if (timestamp - cache_added["TS:" + id] > 180) { + localStorage.removeItem(id); } - - cache_added = tmp; } } else { @@ -1875,25 +1872,20 @@ function cache_invalidate(id) { if (has_local_storage()) { - var tmp = []; var found = false; - for (var key in cache_added) { - var key_id = key.replace("TS:", ""); + for (var i = 0; i < localStorage.length; i++) { + var key = localStorage.key(i); // console.warn("cache_invalidate: " + key_id + " cmp " + id); - if (key_id == id || key_id.indexOf(id + ":") == 0) { - localStorage.removeItem(key_id); + if (key == id || key.indexOf(id + ":") == 0) { + localStorage.removeItem(key); found = true; break; - } else { - tmp[key] = cache_added[key]; } } - cache_added = tmp; - return found; } else { -- 2.39.5