<?xml version="1.0" encoding="UTF-8"?>
<commit>
  <added type="array"/>
  <modified type="array">
    <modified>
      <diff>@@ -1,9 +1,10 @@
 # This code is in Public Domain. Take all the code you want, we'll just write more.
 import os, string, Cookie, sha, time, random, cgi, urllib, datetime, StringIO, pickle
 import wsgiref.handlers
-from google.appengine.ext import db
 from google.appengine.api import users
+from google.appengine.api import memcache
 from google.appengine.ext import webapp
+from google.appengine.ext import db
 from google.appengine.ext.webapp import template
 from django.utils import feedgenerator
 from django.template import Context, Template
@@ -45,6 +46,8 @@ from offsets import *
 NOT_ACCEPTABLE = 406
 NOT_FOUND = 404
 
+RSS_MEMCACHED_KEY = &quot;rss&quot;
+
 class FofouUser(db.Model):
   # according to docs UserProperty() cannot be optional, so for anon users
   # we set it to value returned by anonUser() function
@@ -439,12 +442,14 @@ class PostDelUndel(webapp.RequestHandler):
       if not post.is_deleted:
         post.is_deleted = True
         post.put()
+        memcache.delete(RSS_MEMCACHED_KEY)
       else:
         logging.info(&quot;Post '%s' is already deleted&quot; % post_id)
     elif path.endswith(&quot;/postundel&quot;):
       if post.is_deleted:
         post.is_deleted = False
         post.put()
+        memcache.delete(RSS_MEMCACHED_KEY)
       else:
         logging.info(&quot;Trying to undelete post '%s' that is not deleted&quot; % post_id)
     else:
@@ -637,6 +642,12 @@ class RssFeed(webapp.RequestHandler):
     if not forum or forum.is_disabled:
       return self.error(NOT_FOUND)
 
+    cached_feed = memcache.get(RSS_MEMCACHED_KEY)
+    if cached_feed is not None:
+      self.response.headers['Content-Type'] = 'text/xml'
+      self.response.out.write(cached_feed)
+      return
+      
     feed = feedgenerator.Atom1Feed(
       title = forum.title or forum.url,
       link = siteroot + &quot;rss&quot;,
@@ -662,6 +673,7 @@ class RssFeed(webapp.RequestHandler):
     feedtxt = feed.writeString('utf-8')
     self.response.headers['Content-Type'] = 'text/xml'
     self.response.out.write(feedtxt)
+    memcache.add(RSS_MEMCACHED_KEY, feedtxt)
 
 # responds to /&lt;forumurl&gt;/rssall, returns an RSS feed of all recent posts
 # This is good for forum admins/moderators who want to monitor all posts
@@ -928,6 +940,7 @@ class PostForm(webapp.RequestHandler):
     user_ip = ip2long(get_remote_ip())
     p = Post(topic=topic, forum=forum, user=user, user_ip=user_ip, message=message, sha1_digest=sha1_digest, user_name = name, user_email = email, user_homepage = homepage)
     p.put()
+    memcache.delete(RSS_MEMCACHED_KEY)
     if topic_id:
       self.redirect(siteroot + &quot;topic?id=&quot; + str(topic_id))
     else:</diff>
      <filename>main.py</filename>
    </modified>
    <modified>
      <diff>@@ -26,9 +26,7 @@ TODO nice to have:
 TODO low priority:
  - more templates and ability to choose a template in /manageforums
  - /rsscombined - all posts for all forums, for forum admins mostly
- - cache generated rss feeds using memcached and invalidate them when
-   there's a new post (invalidate /rss and /rssall feed) or new topic
-   (invalidate only /rss; also on post delete/undelete)
+ - cache main page in memcached, similar to rss feeds
  - cookie validation
  - alternative forms of integration with a website (iframe? return data
    as json and do most of the rendering using javascript?)</diff>
      <filename>todo.txt</filename>
    </modified>
  </modified>
  <removed type="array"/>
  <parents type="array">
    <parent>
      <id>0ec48fd932a0c8bf4a3d593cea877d09a967afca</id>
    </parent>
  </parents>
  <author>
    <name>Krzysztof Kowalczyk</name>
    <email>kkowalczyk@gmail.com</email>
  </author>
  <url>http://github.com/kjk/fofou/commit/879c13a1e665949501b997e33248a32f4ecc0b16</url>
  <id>879c13a1e665949501b997e33248a32f4ecc0b16</id>
  <committed-date>2008-12-25T03:59:18-08:00</committed-date>
  <authored-date>2008-12-25T03:59:18-08:00</authored-date>
  <message>hopefully decrease cpu usage on appengine by memcached'ing generated rss feed, since it doesn't change often and is the biggest cpu usage according to admin tools</message>
  <tree>e068cf26450735f7562c09ca83cae0d5d9b7b752</tree>
  <committer>
    <name>Krzysztof Kowalczyk</name>
    <email>kkowalczyk@gmail.com</email>
  </committer>
</commit>
