#!/usr/bin/env python # -*- coding: utf-8 -*- import wikipedia import oursql import cgitb; cgitb.enable(logdir='tracebacks') connections = {} def getConn(wiki): if not wiki.endswith('_p'): wiki+='_p' if wiki not in connections: connections[wiki] = oursql.connect(db=wiki, host=wiki.replace('_', '-') + '.userdb.toolserver.org', read_default_file='/home/dispenser/.my.cnf', charset=None, use_unicode=False) return connections[wiki] def reconnect(wiki, host=""): if not wiki.endswith('_p'): wiki+='_p' del connection[host,wiki] return getConn(wiki, host) def main(): SysArgs = wikipedia.SysArgs limit = SysArgs.get('limit', '250') offset = SysArgs.get('offset', '0') page = wikipedia.Page( wikipedia.getSite(), SysArgs.get('category', SysArgs.get('page', 'Main_Page')), defaultNamespace=14 ) site = page.site() category = page.titleWithoutNamespace(underscore=True) categories = category.split('|') def createLink(title, label=None): return '%s'%tuple(wikipedia.escape(s) for s in (site.hostname(), wikipedia.urllib.quote(title.replace(' ', '_'), safe=";@$!*(),/:-_."), title.replace('_', ' '), label or title.replace('_', ' '), )) conn = getConn(site.dbName()) cursor = conn.cursor() try: cursor.execute("""/* LIMIT:20 */ SELECT cat_pages FROM category WHERE cat_title=? """, (category,)) ((cat_pages,),) = cursor.fetchall() # FIXME cat_pages might be < limit print "

The following %s articles are in %s, out of %d total. This list may not reflect recent changes (%s).

" % ( wikipedia.escape(limit), createLink("Category:%s"%category), cat_pages, createLink("Wikipedia:FAQ/Categories#Why_might_a_category_list_not_be_up_to_date?", "learn more") ) except Exception, e: wikipedia.output(repr(e)) try: cursor.execute("""/* categorder LIMIT:300 NM */ SELECT page_title AS "Article title", IFNULL(blc_count, "") AS "Incoming links", ROUND(page_len / 1024.0, 1) AS "KB" FROM categorylinks JOIN page ON page_id=cl_from LEFT JOIN u_dispenser_p.backlinkcount_enwiki_p ON blc_from=cl_from WHERE cl_to IN (%s) AND cl_type="page" AND page_namespace=0 ORDER BY blc_count DESC, cl_sortkey ASC LIMIT ?, ? """ % ','.join(('?',)*len(categories)), tuple(categories)+(offset, limit)) except oursql.Error as (errno, strerror, extra): if errno == 1317: print '

Query timed out.

' return else: (categories, offset, limit) raise else: print '' print '' for tup in cursor.description: print ''%tup[0] print '' for page_title, blc_count, size in cursor: print '''''' % ( createLink(page_title), blc_count, size, ) print '
%s
%s %s %6s
' cursor.execute("""/* categorder LIMIT:20 */ SELECT TIMESTAMPDIFF(DAY, CREATE_TIME, NOW()) FROM information_schema.tables WHERE TABLE_SCHEMA='u_dispenser_p' AND TABLE_NAME="backlinkcount_enwiki_p" """) print 'Counts of incoming links were updated %s days ago.'%cursor.fetchall().pop() if __name__ == "__main__" and wikipedia.handleUrlAndHeader(): try: wikipedia.startContent(form=True) main() except oursql.Error as (errno, strerror, extra): if errno in (1040, 1226, 2013): # Too many connection / Max connections / Lost connection print '

Database operational error, retrying a few minutes.

%s
'%(wikipedia.escape(strerror),) print '' else: raise finally: wikipedia.endContent() wikipedia.stopme()