#906 snmp browser is very slow sometimes
This commit is contained in:
		| @@ -11,20 +11,11 @@ __PACKAGE__->table_class('DBIx::Class::ResultSource::View'); | ||||
| __PACKAGE__->table("oid_children"); | ||||
| __PACKAGE__->result_source_instance->is_virtual(1); | ||||
| __PACKAGE__->result_source_instance->view_definition(<<ENDSQL | ||||
|  | ||||
|     SELECT DISTINCT(db.oid_parts[?]) AS part, count(distinct(db2.oid_parts[?])) as children | ||||
|     SELECT DISTINCT(db.oid_parts[?]) AS part, count(distinct(db.oid_parts[?])) as children | ||||
|       FROM device_browser db | ||||
|  | ||||
|       LEFT JOIN device_browser db2 | ||||
|       ON (db2.oid LIKE ? || '.%' | ||||
|           AND db2.oid_parts[?] = db.oid_parts[?] | ||||
|           AND db2.ip = db.ip) | ||||
|  | ||||
|       WHERE db.ip = ? | ||||
|             AND db.oid LIKE ? || '.%' | ||||
|  | ||||
|       GROUP BY db.oid_parts | ||||
|  | ||||
|       GROUP BY db.oid_parts[?], db.oid_parts | ||||
| ENDSQL | ||||
| ); | ||||
|  | ||||
|   | ||||
| @@ -123,17 +123,30 @@ sub _get_snmp_data { | ||||
|     my @parts = grep {length} split m/\./, $base; | ||||
|     ++$recurse; | ||||
|  | ||||
|     # psql cannot cope with bind params and group by array element | ||||
|     # so we build a static query instead. | ||||
|  | ||||
|     my $next_part  = (scalar @parts + 1); | ||||
|     my $child_part = (scalar @parts + 2); | ||||
|     my $query = <<QUERY; | ||||
|   SELECT db.oid_parts[$next_part] AS part, | ||||
|          count(distinct(db.oid_parts[$child_part])) as children | ||||
|     FROM device_browser db | ||||
|     WHERE db.ip = ? | ||||
|           AND db.oid LIKE ? || '.%' | ||||
|     GROUP BY db.oid_parts[$next_part] | ||||
| QUERY | ||||
|     my $rs = schema('netdisco')->resultset('Virtual::GenericReport')->result_source; | ||||
|     $rs->view_definition($query); | ||||
|     $rs->remove_columns($rs->columns); | ||||
|     $rs->add_columns(qw/part children/); | ||||
|  | ||||
|     my %kids = map { ($base .'.'. $_->{part}) => $_ } | ||||
|                schema('netdisco')->resultset('Virtual::OidChildren') | ||||
|                                  ->search({}, { bind => [ | ||||
|                                      (scalar @parts + 1), | ||||
|                                      (scalar @parts + 2), | ||||
|                                      $base, | ||||
|                                      (scalar @parts + 1), | ||||
|                                      (scalar @parts + 1), | ||||
|                                      $ip, | ||||
|                                      $base, | ||||
|                                  ] })->hri->all; | ||||
|                    schema('netdisco')->resultset('Virtual::GenericReport') | ||||
|                    ->search(undef, { | ||||
|                      result_class => 'DBIx::Class::ResultClass::HashRefInflator', | ||||
|                      bind => [$ip, $base], | ||||
|                    })->hri->all; | ||||
|  | ||||
|     return [{ | ||||
|       text => 'No SNMP data for this device.', | ||||
|   | ||||
		Reference in New Issue
	
	Block a user