Changeset 733 for trunk/DNSDB.pm


Ignore:
Timestamp:
06/23/16 16:52:59 (8 years ago)
Author:
Kris Deugau
Message:

/trunk

Add log filtering supporting redirecting to a "base" log set for user,
domain, or revzone, and a free text field to filter the entries. Closes #17.

While we're meddling with the log entry retrieval, start an experiment
to merge getFooCount() and getFooList() subs. See #62.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/DNSDB.pm

    r732 r733  
    48124812# Get a count of log entries
    48134813# Takes a database handle and a hash containing at least:
    4814 # - Entity ID and entity type as the primary log "slice"
     4814# - Entity identifier and entity type as the primary log "slice"
    48154815sub getLogCount {
    48164816  my $self = shift;
    4817   my $dbh = $self->{dbh};
    4818 
    4819   my %args = @_;
    4820 
    4821   my @filterargs;
    4822 ##fixme:  which fields do we want to filter on?
    4823 # push @filterargs,
    4824 
    4825   $errstr = 'Missing primary parent ID and/or type';
    4826   # fail early if we don't have a "prime" ID to look for log entries for
    4827   return if !$args{id};
    4828 
    4829   # or if the prime id type is missing or invalid
    4830   return if !$args{logtype};
    4831   $args{logtype} = 'revzone' if $args{logtype} eq 'rdns';       # hack pthui
    4832   $args{logtype} = 'domain' if $args{logtype} eq 'dom';         # hack pthui
    4833   return if !grep /^$args{logtype}$/, ('group', 'domain', 'revzone', 'user');
    4834 
    4835   my $sql = "SELECT count(*) FROM log ".
    4836         "WHERE $id_col{$args{logtype}}=?".
    4837         ($args{filter} ? " AND entry ~* ?" : '');
    4838   my ($count) = $dbh->selectrow_array($sql, undef, ($args{id}, @filterargs) );
    4839   $errstr = $dbh->errstr if !$count;
    4840   return $count;
     4817  return $self->getLogEntries(@_, count => 1);
    48414818} # end getLogCount()
    48424819
     
    48454822# Get a list of log entries
    48464823# Takes arguments as with getLogCount() above, plus optional:
     4824# - "count" flag
     4825#  OR
    48474826# - sort field
    48484827# - sort order
     
    48564835  my @filterargs;
    48574836
    4858   # fail early if we don't have a "prime" ID to look for log entries for
    4859   return if !$args{id};
    4860 
    4861   # or if the prime id type is missing or invalid
     4837  # fail if the prime id type is missing or invalid
     4838  $errstr = "Missing primary log slice type";
    48624839  return if !$args{logtype};
    48634840  $args{logtype} = 'revzone' if $args{logtype} eq 'rdns';       # hack pthui
    48644841  $args{logtype} = 'domain' if $args{logtype} eq 'dom';         # hack pthui
     4842  $errstr = "Invalid primary log slice type";
    48654843  return if !grep /^$args{logtype}$/, ('group', 'domain', 'revzone', 'user');
     4844
     4845  # fail if we don't have a prime ID to look for log entries for
     4846  $errstr = "Missing ID for primary log slice";
     4847  return if !($args{id} || $args{fname});
    48664848
    48674849  # Sorting defaults
     
    48704852  $args{offset} = 0 if !$args{offset} || $args{offset} !~ /^(?:all|\d+)$/;
    48714853
    4872   my %sortmap = (fname => 'name', username => 'email', entry => 'entry', stamp => 'stamp');
     4854  my %sortmap = (fname => 'name', username => 'email', entry => 'entry', stamp => 'stamp',
     4855      revzone => 'revnet', domain => 'domain');
    48734856  $args{sortby} = $sortmap{$args{sortby}};
    48744857
    4875   my $sql = "SELECT user_id AS userid, email AS useremail, name AS userfname, entry AS logentry, ".
    4876         "date_trunc('second',stamp) AS logtime ".
    4877         "FROM log ".
    4878         "WHERE $id_col{$args{logtype}}=?".
    4879         ($args{filter} ? " AND entry ~* ?" : '').
    4880         " ORDER BY $args{sortby} $args{sortorder}, log_id $args{sortorder}".
     4858  push @filterargs, $args{filter} if $args{filter};
     4859  my $sql;
     4860  if ($args{count}) {
     4861    $sql = "SELECT count(*) FROM log l ";
     4862  } else {
     4863    $sql = "SELECT l.user_id AS userid, l.name AS userfname, d.domain, l.domain_id, r.revnet AS revzone, ".
     4864        "l.rdns_id, l.entry AS logentry, date_trunc('second',l.stamp) AS logtime ".
     4865        "FROM log l ".
     4866        "LEFT JOIN domains d ON l.domain_id = d.domain_id ".
     4867        "LEFT JOIN revzones r ON l.rdns_id = r.rdns_id ";
     4868  }
     4869
     4870  # decide which ID argument to use.  Only use the "full name" if no normal ID is present
     4871  my $idarg;
     4872  if ($args{id}) {
     4873    $sql .= "WHERE l.$id_col{$args{logtype}} = ? ";
     4874    $idarg = $args{id};
     4875  } else {
     4876    $sql .= "WHERE l.name = ? ";
     4877    $idarg = $args{fname};
     4878  }
     4879
     4880  # add the entry filter, if any
     4881  $sql .= ($args{filter} ? " AND entry ~* ?" : '');
     4882
     4883  # Limit scope based on group.  Mainly useful for ltype==user, so subgroup
     4884  # users can see what the deities in parent groups have done to their domains.
     4885  if ($args{group} != 1) {
     4886    my @grouplist;
     4887    $self->getChildren($args{group}, \@grouplist);
     4888    my $groupset = join(',', $args{group}, @grouplist);
     4889    $sql .= " AND l.group_id IN ($groupset)";
     4890  }
     4891
     4892  if ($args{count}) {
     4893    my ($count) = $dbh->selectrow_array($sql, undef, ($idarg, @filterargs) );
     4894    $errstr = $dbh->errstr if !$count;
     4895    return $count;
     4896  } else {
     4897    $sql .= " ORDER BY $args{sortby} $args{sortorder}, log_id $args{sortorder}".
    48814898        ($args{offset} eq 'all' ? '' : " LIMIT $self->{perpage} OFFSET ".$args{offset}*$self->{perpage});
    4882   my $loglist = $dbh->selectall_arrayref($sql, { Slice => {} }, ($args{id}, @filterargs) );
    4883   $errstr = $dbh->errstr if !$loglist;
    4884   return $loglist;
     4899    my $loglist = $dbh->selectall_arrayref($sql, { Slice => {} }, ($idarg, @filterargs) );
     4900    $errstr = $dbh->errstr if !$loglist;
     4901    return $loglist;
     4902  }
     4903
     4904  # Your llama is on fire
     4905
    48854906} # end getLogEntries()
    48864907
Note: See TracChangeset for help on using the changeset viewer.