queries.py   [plain text]


#!/usr/bin/python -u
#
# Processing of the queries results
#
import sys
import index
import time
import traceback
import string

if index.openMySQL(verbose = 0) < 0:
    print "Failed to connect to the MySQL database"
    sys.exit(1)

DB = index.DB

def getTopQueriesDB(base = "Queries", number = 50):
    global DB

    try:
        import os
	os.mkdir("searches")
    except:
        pass
    
    date = time.strftime("%Y%m%d")
    f = open("searches/%s-%s.xml" % (base, date), "w")
    c = DB.cursor()
    try:
        ret = c.execute("""select sum(Count) from %s""" % (base))
	row = c.fetchone()
	total = int(row[0])
        ret = c.execute("""select count(*) from %s""" % (base))
	row = c.fetchone()
	uniq = int(row[0])
        ret = c.execute(
           """select * from %s ORDER BY Count DESC LIMIT %d""" % (base, number))
	i = 0;
	f.write("<queries total='%d' uniq='%d' nr='%d' date='%s'>\n" % (
	      total, uniq, number, date))
	while i < ret:
	    row = c.fetchone()
	    f.write("  <query count='%d'>%s</query>\n" % (int(row[2]), row[1]))
	    i = i + 1
	f.write("</queries>\n")
    except:
        print "getTopQueries %s %d failed\n" % (base, number)
	print sys.exc_type, sys.exc_value
	return -1
    f.close()

def getTopQueries(number = 50):
    return getTopQueriesDB(base = "Queries", number = number)

def getAllTopQueries(number = 50):
    return getTopQueriesDB(base = "AllQueries", number = number)

def increaseTotalCount(Value, count):
    global DB

    c = DB.cursor()
    try:
        ret = c.execute("""select ID,Count from AllQueries where Value='%s'""" %
	                (Value))
	row = c.fetchone()
	id = row[0]
	cnt = int(row[1]) + count
	ret = c.execute("""UPDATE AllQueries SET Count = %d where ID = %d""" %
	                (cnt, id))
    except:
        ret = c.execute(
	"""INSERT INTO AllQueries (Value, Count) VALUES ('%s', %d)""" %
	                (Value, count))
    

def checkString(str):
    if string.find(str, "'") != -1 or \
       string.find(str, '"') != -1 or \
       string.find(str, "\\") != -1 or \
       string.find(str, " ") != -1 or \
       string.find(str, "\t") != -1 or \
       string.find(str, "\n") != -1 or \
       string.find(str, "\r") != -1:
        return 0
    return 1
def addCounts(frmtable):
    global DB

    i = 0
    c = DB.cursor()
    entries=[]
    try:
        ret = c.execute("""select Value,Count from %s""" % (frmtable))
	while i < ret:
	    i = i + 1
	    row = c.fetchone()
	    if checkString(row[0]):
		entries.append((row[0], int(row[1])))
	    else:
		entries.append((None, int(row[1])))
	
	for row in entries:
	    if row[0] != None:
		increaseTotalCount(row[0], row[1])
    except:
        print "addCounts %s failed" % (frmtable)
	print sys.exc_type, sys.exc_value
	traceback.print_exc(file=sys.stdout)
        
    try:
	c.execute("""DELETE from %s""" % (frmtable))
    except:
	pass


    
getTopQueries()
addCounts('Queries')
getAllTopQueries()