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