def _handle_func_filter(self, func_name, args, keywords): func_filter = _cparser_defs.trace_record_matcher_spec_s() func_filter.type = TRACE_MATCHER_FUNCTION func_filter.u.function_name = func_name.strip() self._struct_references.append(func_filter) func_trace_severity_filter = _cparser_defs.trace_record_matcher_spec_s( ) func_trace_severity_filter.type = TRACE_MATCHER_SEVERITY func_trace_severity_filter.u.severity = TRACE_SEV_FUNC_TRACE self._struct_references.append(func_trace_severity_filter) severity_and_func = _cparser_defs.trace_record_matcher_spec_s() severity_and_func.type = TRACE_MATCHER_AND severity_and_func.u.binary_operator_parameters.a = pointer(func_filter) severity_and_func.u.binary_operator_parameters.b = pointer( func_trace_severity_filter) self._struct_references.append(severity_and_func) value_matchers = self._get_arg_matchers(args, keywords) if len(value_matchers): and_matchers = self._chain_and_matchers([severity_and_func] + value_matchers) return and_matchers else: return severity_and_func
def _handle_typename(self, func_name, expression): type_name = expression.args[0].s type_filter = _cparser_defs.trace_record_matcher_spec_s() type_filter.type = TRACE_MATCHER_TYPE type_filter.u.type_name = type_name self._struct_references.append(type_filter) return type_filter
def _handle_typename(self, func_name, expression): type_name = expression.args[0].s type_filter = _cparser_defs.trace_record_matcher_spec_s() type_filter.type = TRACE_MATCHER_TYPE type_filter.u.type_name = type_name self._struct_references.append(type_filter) return type_filter
def _handle_unary_op(self, operation): if not isinstance(operation.op, Not): raise FilterParseError() new_filter = _cparser_defs.trace_record_matcher_spec_s() new_filter.type = TRACE_MATCHER_NOT self._struct_references.append(pointer(self._parse_expression(operation.operand))) new_filter.u.unary_operator_parameters.param = self._struct_references[-1] return new_filter
def _chain_and_matchers(self, matchers): root = _cparser_defs.trace_record_matcher_spec_s() current_matcher = root current_matcher.type = TRACE_MATCHER_AND for matcher in matchers: current_matcher.type = TRACE_MATCHER_AND current_matcher.u.binary_operator_parameters.a = pointer(matcher) self._struct_references.append(matcher) next_matcher = _cparser_defs.trace_record_matcher_spec_s() self._struct_references.append(next_matcher) next_matcher.type = TRACE_MATCHER_TRUE current_matcher.u.binary_operator_parameters.b = pointer(next_matcher) current_matcher = next_matcher true_matcher = _cparser_defs.trace_record_matcher_spec_s() true_matcher.type = TRACE_MATCHER_TRUE; current_matcher.u.binary_operator_parameters.b = pointer(true_matcher) self._struct_references.append(true_matcher) return root
def _chain_and_matchers(self, matchers): root = _cparser_defs.trace_record_matcher_spec_s() current_matcher = root current_matcher.type = TRACE_MATCHER_AND for matcher in matchers: current_matcher.type = TRACE_MATCHER_AND current_matcher.u.binary_operator_parameters.a = pointer(matcher) self._struct_references.append(matcher) next_matcher = _cparser_defs.trace_record_matcher_spec_s() self._struct_references.append(next_matcher) next_matcher.type = TRACE_MATCHER_TRUE current_matcher.u.binary_operator_parameters.b = pointer( next_matcher) current_matcher = next_matcher true_matcher = _cparser_defs.trace_record_matcher_spec_s() true_matcher.type = TRACE_MATCHER_TRUE current_matcher.u.binary_operator_parameters.b = pointer(true_matcher) self._struct_references.append(true_matcher) return root
def _handle_unary_op(self, operation): if not isinstance(operation.op, Not): raise FilterParseError() new_filter = _cparser_defs.trace_record_matcher_spec_s() new_filter.type = TRACE_MATCHER_NOT self._struct_references.append( pointer(self._parse_expression(operation.operand))) new_filter.u.unary_operator_parameters.param = self._struct_references[ -1] return new_filter
def _handle_const_str(self, expression): if isinstance(expression, Name): const_str = expression.id else: const_str = expression.s const_str_matcher = _cparser_defs.trace_record_matcher_spec_s() const_str_matcher.type = TRACE_MATCHER_CONST_SUBSTRING const_str_matcher.u.const_string = const_str self._struct_references.append(const_str_matcher) return const_str_matcher
def _handle_const_str(self, expression): if isinstance(expression, Name): const_str = expression.id else: const_str = expression.s const_str_matcher = _cparser_defs.trace_record_matcher_spec_s() const_str_matcher.type = TRACE_MATCHER_CONST_SUBSTRING const_str_matcher.u.const_string = const_str self._struct_references.append(const_str_matcher) return const_str_matcher
def _get_arg_matchers(self, args, keywords): value_matchers = [] for arg in args: if not isinstance(arg, (Num, Name)): raise FilterParseError() value_matcher = _cparser_defs.trace_record_matcher_spec_s() value_matcher.type = TRACE_MATCHER_LOG_PARAM_VALUE value_matcher.u.param_value = self._resolve_value(arg) value_matchers.append(value_matcher) for keyword in keywords: name, value = keyword.arg, keyword.value field_matcher = _cparser_defs.trace_record_matcher_spec_s() field_matcher.type = TRACE_MATCHER_LOG_NAMED_PARAM_VALUE field_matcher.u.named_param_value.param_name = name field_matcher.u.named_param_value.param_value = self._resolve_value( value) value_matchers.append(field_matcher) return value_matchers
def _handle_time_filter(self, expression): start_time = self.parser.partial_to_absolute_time(expression.left.s) if not start_time: return None end_time = self.parser.partial_to_absolute_time(expression.comparators[1].s) if not end_time: return None new_filter = _cparser_defs.trace_record_matcher_spec_s() new_filter.type = TRACE_MATCHER_TIMERANGE new_filter.u.time_range.start = start_time new_filter.u.time_range.end = end_time return new_filter
def _handle_bool_op(self, bool_op): op_type_to_filter_type = {And : TRACE_MATCHER_AND, Or : TRACE_MATCHER_OR} filter_type = op_type_to_filter_type[type(bool_op.op)] new_filter = _cparser_defs.trace_record_matcher_spec_s() new_filter.type = filter_type new_filter.u.binary_operator_parameters.a = pointer(self._parse_expression(bool_op.values[0])) new_filter.u.binary_operator_parameters.b = pointer(self._parse_expression(bool_op.values[1])) self._struct_references.append(new_filter.u.binary_operator_parameters.a) self._struct_references.append(new_filter.u.binary_operator_parameters.b) return new_filter
def _get_arg_matchers(self, args, keywords): value_matchers = [] for arg in args: if not isinstance(arg, (Num, Name)): raise FilterParseError() value_matcher = _cparser_defs.trace_record_matcher_spec_s() value_matcher.type = TRACE_MATCHER_LOG_PARAM_VALUE value_matcher.u.param_value = self._resolve_value(arg) value_matchers.append(value_matcher) for keyword in keywords: name, value = keyword.arg, keyword.value field_matcher = _cparser_defs.trace_record_matcher_spec_s() field_matcher.type = TRACE_MATCHER_LOG_NAMED_PARAM_VALUE field_matcher.u.named_param_value.param_name = name; field_matcher.u.named_param_value.param_value = self._resolve_value(value) value_matchers.append(field_matcher) return value_matchers
def _handle_time_filter(self, expression): start_time = self.parser.partial_to_absolute_time(expression.left.s) if not start_time: return None end_time = self.parser.partial_to_absolute_time( expression.comparators[1].s) if not end_time: return None new_filter = _cparser_defs.trace_record_matcher_spec_s() new_filter.type = TRACE_MATCHER_TIMERANGE new_filter.u.time_range.start = start_time new_filter.u.time_range.end = end_time return new_filter
def _handle_func_filter(self, func_name, args, keywords): func_filter = _cparser_defs.trace_record_matcher_spec_s() func_filter.type = TRACE_MATCHER_FUNCTION func_filter.u.function_name = func_name.strip() self._struct_references.append(func_filter) func_trace_severity_filter = _cparser_defs.trace_record_matcher_spec_s() func_trace_severity_filter.type = TRACE_MATCHER_SEVERITY func_trace_severity_filter.u.severity = TRACE_SEV_FUNC_TRACE self._struct_references.append(func_trace_severity_filter) severity_and_func = _cparser_defs.trace_record_matcher_spec_s() severity_and_func.type = TRACE_MATCHER_AND severity_and_func.u.binary_operator_parameters.a = pointer(func_filter) severity_and_func.u.binary_operator_parameters.b = pointer(func_trace_severity_filter) self._struct_references.append(severity_and_func) value_matchers = self._get_arg_matchers(args, keywords) if len(value_matchers): and_matchers = self._chain_and_matchers([severity_and_func] + value_matchers) return and_matchers else: return severity_and_func
def _handle_comparison(self, comparison): if isinstance(comparison.left, Str): if not self._is_time_filter(comparison): raise FilterParseError() new_filter = self._handle_time_filter(comparison) if not new_filter: raise FilterParseError() else: return new_filter if not isinstance(comparison.ops[0], Eq): raise FilterParseError() name = self._get_expr_comparator_name(comparison) value = self._get_expr_comparator_value(comparison) field_to_filter = { 'pid': TRACE_MATCHER_PID, 'tid': TRACE_MATCHER_TID, 'log_id': TRACE_MATCHER_LOGID, 'ts': TRACE_MATCHER_TIMERANGE, 'nesting': TRACE_MATCHER_NESTING, 'severity': TRACE_MATCHER_SEVERITY } if not name in field_to_filter: raise FilterParseError() filter_type = field_to_filter[name] new_filter = _cparser_defs.trace_record_matcher_spec_s() new_filter.type = filter_type if filter_type == TRACE_MATCHER_PID: new_filter.u.pid = value elif filter_type == TRACE_MATCHER_NESTING: new_filter.u.nesting = value elif filter_type == TRACE_MATCHER_TID: new_filter.u.tid = value elif filter_type == TRACE_MATCHER_LOGID: new_filter.u.log_id = value elif filter_type == TRACE_MATCHER_SEVERITY: severity = severity_name_to_severity_value(value) if not severity: raise FilterParseError() new_filter.u.severity = severity return new_filter
def _handle_bool_op(self, bool_op): op_type_to_filter_type = {And: TRACE_MATCHER_AND, Or: TRACE_MATCHER_OR} filter_type = op_type_to_filter_type[type(bool_op.op)] new_filter = _cparser_defs.trace_record_matcher_spec_s() new_filter.type = filter_type new_filter.u.binary_operator_parameters.a = pointer( self._parse_expression(bool_op.values[0])) new_filter.u.binary_operator_parameters.b = pointer( self._parse_expression(bool_op.values[1])) self._struct_references.append( new_filter.u.binary_operator_parameters.a) self._struct_references.append( new_filter.u.binary_operator_parameters.b) return new_filter
def _handle_comparison(self, comparison): if isinstance(comparison.left, Str): if not self._is_time_filter(comparison): raise FilterParseError() new_filter = self._handle_time_filter(comparison) if not new_filter: raise FilterParseError() else: return new_filter if not isinstance(comparison.ops[0], Eq): raise FilterParseError() name = self._get_expr_comparator_name(comparison) value = self._get_expr_comparator_value(comparison) field_to_filter = {'pid' : TRACE_MATCHER_PID, 'tid' : TRACE_MATCHER_TID, 'log_id' : TRACE_MATCHER_LOGID, 'ts' : TRACE_MATCHER_TIMERANGE, 'nesting' : TRACE_MATCHER_NESTING, 'severity' : TRACE_MATCHER_SEVERITY} if not name in field_to_filter: raise FilterParseError() filter_type = field_to_filter[name] new_filter = _cparser_defs.trace_record_matcher_spec_s() new_filter.type = filter_type if filter_type == TRACE_MATCHER_PID: new_filter.u.pid = value elif filter_type == TRACE_MATCHER_NESTING: new_filter.u.nesting = value elif filter_type == TRACE_MATCHER_TID: new_filter.u.tid = value elif filter_type == TRACE_MATCHER_LOGID: new_filter.u.log_id = value elif filter_type == TRACE_MATCHER_SEVERITY: severity = severity_name_to_severity_value(value) if not severity: raise FilterParseError() new_filter.u.severity = severity return new_filter
def true(self): new_filter = _cparser_defs.trace_record_matcher_spec_s() new_filter.type = TRACE_MATCHER_TRUE return TraceFilter(None, new_filter)
def _handle_procname_filter(self, process_name): process_filter = _cparser_defs.trace_record_matcher_spec_s() process_filter.type = TRACE_MATCHER_PROCESS_NAME process_filter.u.process_name = process_name self._struct_references.append(process_filter) return process_filter
def _handle_procname_filter(self, process_name): process_filter = _cparser_defs.trace_record_matcher_spec_s() process_filter.type = TRACE_MATCHER_PROCESS_NAME process_filter.u.process_name = process_name self._struct_references.append(process_filter) return process_filter
def true(self): new_filter = _cparser_defs.trace_record_matcher_spec_s() new_filter.type = TRACE_MATCHER_TRUE; return TraceFilter(None, new_filter)