From: philipp Date: Mon, 14 Feb 2011 20:41:19 +0000 (+0000) Subject: Added module wrmwcache to update the cache tables. X-Git-Url: https://git.toastfreeware.priv.at/philipp/winterrodeln/wrpylib.git/commitdiff_plain/dba173cca510f5203ea591432109c15c87fcdc55 Added module wrmwcache to update the cache tables. git-svn-id: http://www.winterrodeln.org/svn/servermediawiki/trunk/wrpylib@777 7aebc617-e5e2-0310-91dc-80fb5f6d2477 --- diff --git a/setup.py b/setup.py index fd7c21b..cb19e73 100644 --- 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 index 0000000..b863a4e --- /dev/null +++ b/wrpylib/wrmwcache.py @@ -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() +