]> git.wh0rd.org - tt-rss.git/commitdiff
implement label cache; misc fixes (bump schema)
authorAndrew Dolgov <fox@madoka.volgo-balt.ru>
Wed, 10 Nov 2010 15:50:51 +0000 (18:50 +0300)
committerAndrew Dolgov <fox@madoka.volgo-balt.ru>
Wed, 10 Nov 2010 16:01:14 +0000 (19:01 +0300)
backend.php
functions.php
modules/backend-rpc.php
modules/pref-labels.php
sanity_check.php
schema/ttrss_schema_mysql.sql
schema/ttrss_schema_pgsql.sql
viewfeed.js

index c19c3b9e3d393c29318a892c33cf78b72fc61cd5..68187428b1b15f284a9485a40611928e70077271 100644 (file)
                                        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);
 
                        print "]]></headlines>";
 
+                       if ($_REQUEST["debug"]) $timing_info = print_checkpoint("05", $timing_info);
+
                        //print "<headlines-count value=\"$headlines_count\"/>";
                        //print "<vgroup-last-feed value=\"$vgroup_last_feed\"/>";
 
index 9b69589498df2657b4c16df3bfd90d18c33c37b8..44d4ae200a523da65746dfb2405d0424d5774521 100644 (file)
                                                $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
                                $labels_str .= format_article_labels($labels, $id);
                                $labels_str .= "</span>";
        
-                               if (count($topmost_article_ids) < 5) {
+                               if (count($topmost_article_ids) < 3) {
                                        array_push($topmost_article_ids, $id);
                                }
 
        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();
                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;
                }
        }
 
+       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);
                        WHERE 
                                label_id = '$label_id' AND
                                article_id = '$id'");
+
+               label_clear_cache($link, $id);
        }
 
        function label_add_article($link, $id, $label, $owner_uid) {
                        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);
                $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) {
 
                        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");
        }
                                }
                        }
        
-                       if (db_num_rows($result) == 1) {
+                       if (count($entries) == 1) {
                                print __("Attachment:") . " ";
                        } else {
                                print __("Attachments:") . " ";
index 047558fc20e9a9e9bfaa245c2a08c8fac5e0336f..f28e72475510b902523a5b2bd7c4a01370f2eb54 100644 (file)
 
                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, 
index 73d6e583f40b49f290a927a47ae682d424bd5ee1..884a25d1a5d217b65f853434dd1b133ffa34187f 100644 (file)
                                                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;
                                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"]);
                        }
 
                }
index 79291ef375a61144fbb201238687169e70eb78e4..7fc40447a532e9a455c593ab196e11f0a64b9af9 100644 (file)
@@ -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 "<b>Fatal Error</b>: You forgot to copy 
index e3408238063c0a5fd5a9142ae6bd741272a30222..adf158c6f9193dfc06dc97614140e4f9b98facac 100644 (file)
@@ -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,
index fc12650054a73ab1147ba80441dd70bc70018e9b..152af5dd3b8e1d9cbe116fd0bb37419296cfd945 100644 (file)
@@ -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,
index 5f5108780f5eebe8863ddeaa5c4769708b90325d..dbb5d77dbc38088ea3b925aaf1e4bc36ba0dd57a 100644 (file)
@@ -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 {