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