• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1"""
2This library provides a bunch of miscellaneous parameter parsing,
3sql generating and list cleanup library functions that are used
4by both the reporting cli and web interface.
5"""
6
7import os
8import re
9import sys
10
11import common
12from autotest_lib.tko import display
13from autotest_lib.tko import frontend
14
15def parse_scrub_and_gen_condition(condition, valid_field_dict):
16    me = parse_scrub_and_gen_condition   # shorten the name
17    compare_ops = {'=':'=', '<>':'<>', '==':'=', '!=':'<>', '>':'>',
18                   '<':'<', '>=':'>=', '<=':'<=', '~':'LIKE', '#':'REGEXP'}
19
20    # strip white space
21    condition = condition.strip()
22
23    # OR
24    match = re.match(r'^(.+)[|](.+)$', condition)
25    if match:
26        (a_sql, a_values) = me(match.group(1), valid_field_dict)
27        (b_sql, b_values) = me(match.group(2), valid_field_dict)
28        return (" (%s) OR (%s) " % (a_sql, b_sql),
29                a_values + b_values)
30
31    # AND
32    match = re.match(r'^(.+)[&](.+)$', condition)
33    if match:
34        (a_sql, a_values) = me(match.group(1), valid_field_dict)
35        (b_sql, b_values) = me(match.group(2), valid_field_dict)
36        return (" (%s) AND (%s) " % (a_sql, b_sql),
37                a_values + b_values)
38
39    # '<field> <op> <value>' where value can be quoted
40    # double quotes are escaped....i.e.  '''' is the same as "'"
41    regex = r'^(%s)[ \t]*(%s)[ \t]*' + \
42            r'(\'((\'\'|[^\'])*)\'|"((""|[^"])*)"|([^\'"].*))$'
43    regex = regex % ('|'.join(valid_field_dict.keys()),
44                     '|'.join(compare_ops.keys()))
45    match = re.match(regex, condition)
46    if match:
47        field = valid_field_dict[match.group(1)]
48        op = compare_ops[match.group(2)]
49        if match.group(5):
50            val = match.group(4).replace("''", "'")
51        elif match.group(7):
52            val = match.group(6).replace('""', '"')
53        elif match.group(8):
54            val = match.group(8)
55        else:
56            raise "Internal error"
57        return ("%s %s %%s" % (field, op), [val])
58
59    raise "Could not parse '%s' (%s)" % (condition, regex)
60