Added module wrmwcache to update the cache tables.
authorphilipp <philipp@7aebc617-e5e2-0310-91dc-80fb5f6d2477>
Mon, 14 Feb 2011 20:41:19 +0000 (20:41 +0000)
committerphilipp <philipp@7aebc617-e5e2-0310-91dc-80fb5f6d2477>
Mon, 14 Feb 2011 20:41:19 +0000 (20:41 +0000)
git-svn-id: http://www.winterrodeln.org/svn/servermediawiki/trunk/wrpylib@777 7aebc617-e5e2-0310-91dc-80fb5f6d2477

setup.py
wrpylib/wrmwcache.py [new file with mode: 0644]

index fd7c21bfd3e23797df232de6ee03777306dbd421..cb19e730594938c3930aad570a03483fce6360ec 100644 (file)
--- a/setup.py
+++ b/setup.py
@@ -3,7 +3,7 @@
 from setuptools import setup
 
 setup(name='wrpylib',
-    version='0.0.8',
+    version='0.0.9',
     description='Winterrodeln Python Library',
     author='Philipp Spitzer',
     author_email='philipp.spitzer@winterrodeln.org',
diff --git a/wrpylib/wrmwcache.py b/wrpylib/wrmwcache.py
new file mode 100644 (file)
index 0000000..b863a4e
--- /dev/null
@@ -0,0 +1,96 @@
+#!/usr/bin/python2.6
+# -*- coding: iso-8859-15 -*-
+# $Id$
+# $HeadURL$
+"""Contains functions that maintain/update the cache tables."""
+from sqlalchemy import schema
+from sqlalchemy.sql import select
+import formencode
+from wrpylib import mwdb, wrmwdb, wrmwmarkup
+
+
+class UpdateCacheError(RuntimeError):
+    pass
+
+
+def update_wrsledruncache(connection):
+    """Updates the wrsledruncache table from the wiki. If convert errors occur, an UpdateCacheError exception
+    is raised. No other exception type should be raised under normal circumstances.
+    
+    >>> from sqlalchemy.engine import create_engine
+    >>> engine = create_engine('mysql://philipp@localhost:3306/winterrodeln_wiki?charset=utf8&use_unicode=0')
+    >>> update_wrsledruncache(engine.connect())
+    """
+    metadata = schema.MetaData()
+    wrsledruncache = wrmwdb.wrsledruncache_table(metadata)
+    page = mwdb.page_table(metadata)
+    categorylinks = mwdb.categorylinks_table(metadata)
+    revision = mwdb.revision_table(metadata)
+    text = mwdb.text_table(metadata)
+
+    transaction = connection.begin()
+
+    # Query all sled runs
+    q = select([page, categorylinks, revision, text], (page.c.page_latest==revision.c.rev_id) & (text.c.old_id==revision.c.rev_text_id) & (categorylinks.c.cl_from==page.c.page_id) & (categorylinks.c.cl_to==u'Rodelbahn'))
+    sledrun_pages = connection.execute(q)
+    # Original SQL:
+    # sql = u"select page_id, rev_id, old_id, page_title, old_text, 'In_Arbeit' in (select cl_to from categorylinks where cl_from=page_id) as under_construction from page, revision, text, categorylinks where page_latest=rev_id and old_id=rev_text_id and cl_from=page_id and cl_to='Rodelbahn' order by page_title"
+    
+    # Delete all existing entries in wrsledruncache
+    # We rely on transactions MySQL InnoDB
+    connection.execute(wrsledruncache.delete())
+    
+    # Refill wrsledruncache table
+    for sledrun_page in sledrun_pages:
+        try: 
+            start, end, sledrun = wrmwmarkup.rodelbahnbox_to_sledrun(sledrun_page.old_text)
+            sledrun.page_id = sledrun_page.page_id
+            sledrun.page_title = sledrun_page.page_title
+            sledrun.under_construction = connection.execute(select([categorylinks], (categorylinks.c.cl_from==sledrun_page.page_id) & (categorylinks.c.cl_to == u'In_Arbeit')).alias('x').count()).fetchone()[0] > 0 # It would be better to do this in the query above
+            connection.execute(wrsledruncache.insert(sledrun.__dict__))
+        except (RuntimeError, formencode.Invalid) as e:
+            transaction.rollback()
+            error_msg = u"Error at sled run '{0}': {1}".format(sledrun_page.page_title, unicode(e))
+            raise UpdateCacheError(error_msg, sledrun_page.page_title, e)
+    transaction.commit()
+
+
+def update_wrinncache(connection):
+    """Updates the wrinncache table from the wiki. If convert errors occur, an UpdateCacheError exception
+    is raised. No other exception type should be raised under normal circumstances.
+    
+    >>> from sqlalchemy.engine import create_engine
+    >>> engine = create_engine('mysql://philipp@localhost:3306/winterrodeln_wiki?charset=utf8&use_unicode=0')
+    >>> update_wrinncache(engine.connect())
+    """
+    metadata = schema.MetaData()
+    wrinncache = wrmwdb.wrinncache_table(metadata)
+    page = mwdb.page_table(metadata)
+    categorylinks = mwdb.categorylinks_table(metadata)
+    revision = mwdb.revision_table(metadata)
+    text = mwdb.text_table(metadata)
+
+    transaction = connection.begin()
+
+    # Query all inns
+    q = select([page, categorylinks, revision, text], (page.c.page_latest==revision.c.rev_id) & (text.c.old_id==revision.c.rev_text_id) & (categorylinks.c.cl_from==page.c.page_id) & (categorylinks.c.cl_to==u'Gasthaus'))
+    inn_pages = connection.execute(q)
+        
+    # Delete all existing entries in wrinncache
+    # We rely on transactions MySQL InnoDB
+    connection.execute(wrinncache.delete())
+        
+    # Refill wrinncache table
+    for inn_page in inn_pages:
+        try: 
+            start, end, inn = wrmwmarkup.gasthausbox_to_inn(inn_page.old_text)
+            inn.page_id = inn_page.page_id
+            inn.page_title = inn_page.page_title
+            inn.under_construction = connection.execute(select([categorylinks], (categorylinks.c.cl_from==inn_page.page_id) & (categorylinks.c.cl_to == u'In_Arbeit')).alias('x').count()).fetchone()[0] > 0 # It would be better to do this in the query above
+            connection.execute(wrinncache.insert(inn.__dict__))
+        except (RuntimeError, formencode.Invalid) as e:
+            transaction.rollback()
+            error_msg = u"Error as inn '{0}': {1}".format(inn_page.page_title, unicode(e))
+            raise UpdateCacheError(error_msg, sledrun_page.page_title, e)
+    transaction.commit()
+