blob: 77e1fbade97ac478287c6ccbc0fd6ca063b2c076 [file] [log] [blame]
"""
This library provides a bunch of miscellaneous parameter parsing,
sql generating and list cleanup library functions that are used
by both the reporting cli and web interface.
"""
import sys, os, re
tko = os.path.dirname(__file__)
sys.path.insert(0, tko)
import display, frontend, db
db = db.db()
def dprint(str):
pass
#print "! %s<br>" % str
def parse_scrub_and_gen_condition(condition, valid_field_dict):
me = parse_scrub_and_gen_condition # shorten the name
compare_ops = {'=':'=', '<>':'<>', '==':'=', '!=':'<>', '>':'>',
'<':'<', '>=':'>=', '<=':'<=', '~':'LIKE', '#':'REGEXP'}
# strip white space
condition = condition.strip()
# ()'s
#match = re.match(r'^[(](.+)[)]$', condition)
#if match:
# dprint("Matched () on %s" % condition)
# depth = 0
# for c in match.group(1):
# if c == '(': depth += 1
# if c == ')': depth -= 1
# if depth < 0: break
# dprint("Depth is %d" % depth)
# if depth == 0:
# dprint("Match...stripping ()'s")
# return me(match.group(1), valid_field_dict)
# OR
match = re.match(r'^(.+)[|](.+)$', condition)
if match:
dprint("Matched | on %s" % condition)
(a_sql, a_values) = me(match.group(1), valid_field_dict)
(b_sql, b_values) = me(match.group(2), valid_field_dict)
return (" (%s) OR (%s) " % (a_sql, b_sql),
a_values + b_values)
# AND
match = re.match(r'^(.+)[&](.+)$', condition)
if match:
dprint("Matched & on %s" % condition)
(a_sql, a_values) = me(match.group(1), valid_field_dict)
(b_sql, b_values) = me(match.group(2), valid_field_dict)
return (" (%s) AND (%s) " % (a_sql, b_sql),
a_values + b_values)
# NOT
#match = re.match(r'^[!](.+)$', condition)
#if match:
# dprint("Matched ! on %s" % condition)
# (sql, values) = me(match.group(1), valid_field_dict)
# return (" NOT (%s) " % (sql,), values)
# '<field> <op> <value>' where value can be quoted
# double quotes are escaped....i.e. '''' is the same as "'"
regex = r'^(%s)[ \t]*(%s)[ \t]*' + \
r'(\'((\'\'|[^\'])*)\'|"((""|[^"])*)"|([^\'"].*))$'
regex = regex % ('|'.join(valid_field_dict.keys()),
'|'.join(compare_ops.keys()))
match = re.match(regex, condition)
if match:
field = valid_field_dict[match.group(1)]
op = compare_ops[match.group(2)]
if match.group(5):
val = match.group(4).replace("''", "'")
elif match.group(7):
val = match.group(6).replace('""', '"')
elif match.group(8):
val = match.group(8)
else:
raise "Internal error"
return ("%s %s %%s" % (field, op), [val])
raise "Could not parse '%s' (%s)" % (condition, regex)