From af95f4d3e0c19f34c8bb57c7bdd77818359f8a87 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Eli=C3=A1n=20Hanisch?= Date: Sat, 5 Nov 2011 20:33:33 -0300 Subject: [PATCH] make bantracker page go faster, like, 10 times faster. --- Bantracker/bans.cgi | 86 +++++++++++++++++++++++++++++++++------------ 1 file changed, 64 insertions(+), 22 deletions(-) diff --git a/Bantracker/bans.cgi b/Bantracker/bans.cgi index 445ef6a..3dd48a5 100755 --- a/Bantracker/bans.cgi +++ b/Bantracker/bans.cgi @@ -14,6 +14,7 @@ ### import sys +import time # This needs to be set to the location of the commoncgi.py file sys.path.append('/var/www/bot') from commoncgi import * @@ -22,6 +23,8 @@ from commoncgi import * db = '/home/bot/data/bans.db' num_per_page = 100 +t1 = time.time() + con = sqlite.connect(db) cur = con.cursor() @@ -178,11 +181,42 @@ for h in [['Channel',0], ['Nick/Mask',1], ['Operator',2], ['Time',6]]: print 'Log' # Select and filter bans -def getBans(id=None): - if id is None: - cur.execute('SELECT channel,mask,operator,time,removal,removal_op,id FROM bans ORDER BY id DESC') +def getBans(id=None, mask=None, kicks=True, oldbans=True, bans=True, floods=True, operator=None, + channel=None): + sql = "SELECT channel, mask, operator, time, removal, removal_op, id FROM bans" + args = [] + where = [] + if id: + where.append("id = %s") + args.append(id) + if mask: + where.append("mask LIKE %s") + args.append('%' + mask + '%') + if not floods: + where.append("operator NOT LIKE 'floodbot%%'") + if operator: + where.append("operator LIKE %s") + args.append("%" + operator + "%") + if channel: + where.append("channel LIKE %s") + args.append(channel) + if not kicks: + where.append("mask LIKE '%%!%%'") + if not (oldbans or bans): + where.append("mask NOT LIKE '%%!%%'") else: - cur.execute('SELECT channel,mask,operator,time,removal,removal_op,id FROM bans ORDER BY id DESC WHERE id = %d', (id,)) + if kicks: + s = "(mask NOT LIKE '%%%%!%%%%' OR (mask LIKE '%%%%!%%%%' AND %s))" + else: + s = "%s" + if not oldbans: + where.append(s % "removal IS NULL") + elif not bans: + where.append(s % "removal IS NOT NULL") + sql += " WHERE " + " AND ".join(where) + sql += " ORDER BY id DESC" + #print where, args, "
" + cur.execute(sql, args) return cur.fetchall() def myfilter(item, regex, kick, ban, oldban, mute, oldmute, floods, operator, channel): @@ -219,27 +253,29 @@ def getQueryTerm(query, term): return (query, None) bans = [] +oper = chan = False if form.has_key('query'): - try: - bans = getBans(int(form['query'].value)) + query = form['query'].value + if query.isdigit(): + bans = getBans(id=int(query)) start = 0; end = 1 - except: - bans = getBans() - k = b = ob = m = om = fb = False - oper = chan = False - if form.has_key('kicks'): k = True - if form.has_key('oldbans'): ob = True - if form.has_key('bans'): b = True - if form.has_key('oldmutes'): om = True - if form.has_key('mutes'): m = True - if form.has_key('floods'): fb = True - if "chan:" in form['query'].value: - (form['query'].value, chan) = getQueryTerm(form['query'].value, "chan:") - if "oper:" in form['query'].value: - (form['query'].value, oper) = getQueryTerm(form['query'].value, "oper:") - regex = re.compile(re.escape(form['query'].value).replace('\%','.*'), re.DOTALL | re.I) - bans = filter(lambda x: myfilter(x, regex, k, b, ob, m, om, fb, oper, chan), bans) + else: + if "chan:" in query: + (query, chan) = getQueryTerm(query, "chan:") + if "oper:" in query: + (query, oper) = getQueryTerm(query, "oper:") + bans = getBans(mask=query, kicks=form.has_key('kicks'), + oldbans=form.has_key('oldbans'), + bans=form.has_key('bans'), + floods=form.has_key('floods'), + operator=oper, + channel=chan) + #k = b = ob = m = om = fb = False + #if form.has_key('oldmutes'): om = True + #if form.has_key('mutes'): m = True + #regex = re.compile(re.escape(form['query'].value).replace('\%','.*'), re.DOTALL | re.I) + #bans = filter(lambda x: myfilter(x, regex, k, b, ob, m, om, fb, oper, chan), bans) start = 0; end = len(bans) else: page = 0 @@ -331,6 +367,12 @@ if not bans and form.has_key('query'): print "
No matches for: "%s" by %s
" % (form['query'].value, oper) else: print "
No matches for: "%s"
" % form['query'].value +elif form.has_key('query'): + print "
Found %s matches
" % end + +t2 = time.time() + +print "Generated in %.4f seconds
" % (t2 - t1) # Aaaaaaaaaaaaaaaaand send! send_page('bans.tmpl')