Fixed bug: Foreign key to old table name.
[philipp/winterrodeln/wrpylib.git] / wrpylib / wrmwcache.py
1 #!/usr/bin/python2.6
2 # -*- coding: iso-8859-15 -*-
3 # $Id$
4 # $HeadURL$
5 """Contains functions that maintain/update the cache tables."""
6 from sqlalchemy import schema
7 from sqlalchemy.sql import select
8 import formencode
9 from wrpylib import mwdb, wrmwdb, wrmwmarkup
10
11
12 class UpdateCacheError(RuntimeError):
13     pass
14
15
16 def update_wrsledruncache(connection):
17     """Updates the wrsledruncache table from the wiki. If convert errors occur, an UpdateCacheError exception
18     is raised. No other exception type should be raised under normal circumstances.
19     
20     >>> from sqlalchemy.engine import create_engine
21     >>> engine = create_engine('mysql://philipp@localhost:3306/winterrodeln_wiki?charset=utf8&use_unicode=0')
22     >>> update_wrsledruncache(engine.connect())
23     """
24     metadata = schema.MetaData()
25     wrsledruncache = wrmwdb.wrsledruncache_table(metadata)
26     page = mwdb.page_table(metadata)
27     categorylinks = mwdb.categorylinks_table(metadata)
28     revision = mwdb.revision_table(metadata)
29     text = mwdb.text_table(metadata)
30
31     transaction = connection.begin()
32
33     # Query all sled runs
34     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'))
35     sledrun_pages = connection.execute(q)
36     # Original SQL:
37     # 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"
38     
39     # Delete all existing entries in wrsledruncache
40     # We rely on transactions MySQL InnoDB
41     connection.execute(wrsledruncache.delete())
42     
43     # Refill wrsledruncache table
44     for sledrun_page in sledrun_pages:
45         try: 
46             start, end, sledrun = wrmwmarkup.rodelbahnbox_to_sledrun(sledrun_page.old_text)
47             sledrun.page_id = sledrun_page.page_id
48             sledrun.page_title = sledrun_page.page_title
49             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
50             connection.execute(wrsledruncache.insert(sledrun.__dict__))
51         except (RuntimeError, formencode.Invalid) as e:
52             transaction.rollback()
53             error_msg = u"Error at sled run '{0}': {1}".format(sledrun_page.page_title, unicode(e))
54             raise UpdateCacheError(error_msg, sledrun_page.page_title, e)
55     transaction.commit()
56
57
58 def update_wrinncache(connection):
59     """Updates the wrinncache table from the wiki. If convert errors occur, an UpdateCacheError exception
60     is raised. No other exception type should be raised under normal circumstances.
61     
62     >>> from sqlalchemy.engine import create_engine
63     >>> engine = create_engine('mysql://philipp@localhost:3306/winterrodeln_wiki?charset=utf8&use_unicode=0')
64     >>> update_wrinncache(engine.connect())
65     """
66     metadata = schema.MetaData()
67     wrinncache = wrmwdb.wrinncache_table(metadata)
68     page = mwdb.page_table(metadata)
69     categorylinks = mwdb.categorylinks_table(metadata)
70     revision = mwdb.revision_table(metadata)
71     text = mwdb.text_table(metadata)
72
73     transaction = connection.begin()
74
75     # Query all inns
76     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'))
77     inn_pages = connection.execute(q)
78         
79     # Delete all existing entries in wrinncache
80     # We rely on transactions MySQL InnoDB
81     connection.execute(wrinncache.delete())
82         
83     # Refill wrinncache table
84     for inn_page in inn_pages:
85         try: 
86             start, end, inn = wrmwmarkup.gasthausbox_to_inn(inn_page.old_text)
87             inn.page_id = inn_page.page_id
88             inn.page_title = inn_page.page_title
89             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
90             connection.execute(wrinncache.insert(inn.__dict__))
91         except (RuntimeError, formencode.Invalid) as e:
92             transaction.rollback()
93             error_msg = u"Error as inn '{0}': {1}".format(inn_page.page_title, unicode(e))
94             raise UpdateCacheError(error_msg, inn_page.page_title, e)
95     transaction.commit()
96