#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__->table("oid_children");
|
||||||
__PACKAGE__->result_source_instance->is_virtual(1);
|
__PACKAGE__->result_source_instance->is_virtual(1);
|
||||||
__PACKAGE__->result_source_instance->view_definition(<<ENDSQL
|
__PACKAGE__->result_source_instance->view_definition(<<ENDSQL
|
||||||
|
SELECT DISTINCT(db.oid_parts[?]) AS part, count(distinct(db.oid_parts[?])) as children
|
||||||
SELECT DISTINCT(db.oid_parts[?]) AS part, count(distinct(db2.oid_parts[?])) as children
|
|
||||||
FROM device_browser db
|
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 = ?
|
WHERE db.ip = ?
|
||||||
AND db.oid LIKE ? || '.%'
|
AND db.oid LIKE ? || '.%'
|
||||||
|
GROUP BY db.oid_parts[?], db.oid_parts
|
||||||
GROUP BY db.oid_parts
|
|
||||||
|
|
||||||
ENDSQL
|
ENDSQL
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|||||||
@@ -123,17 +123,30 @@ sub _get_snmp_data {
|
|||||||
my @parts = grep {length} split m/\./, $base;
|
my @parts = grep {length} split m/\./, $base;
|
||||||
++$recurse;
|
++$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}) => $_ }
|
my %kids = map { ($base .'.'. $_->{part}) => $_ }
|
||||||
schema('netdisco')->resultset('Virtual::OidChildren')
|
schema('netdisco')->resultset('Virtual::GenericReport')
|
||||||
->search({}, { bind => [
|
->search(undef, {
|
||||||
(scalar @parts + 1),
|
result_class => 'DBIx::Class::ResultClass::HashRefInflator',
|
||||||
(scalar @parts + 2),
|
bind => [$ip, $base],
|
||||||
$base,
|
})->hri->all;
|
||||||
(scalar @parts + 1),
|
|
||||||
(scalar @parts + 1),
|
|
||||||
$ip,
|
|
||||||
$base,
|
|
||||||
] })->hri->all;
|
|
||||||
|
|
||||||
return [{
|
return [{
|
||||||
text => 'No SNMP data for this device.',
|
text => 'No SNMP data for this device.',
|
||||||
|
|||||||
Reference in New Issue
Block a user