Index: trunk/DNSDB.pm
===================================================================
--- trunk/DNSDB.pm	(revision 672)
+++ trunk/DNSDB.pm	(revision 673)
@@ -4677,5 +4677,5 @@
 
 
-## IPDB::getRevPattern()
+## DNSDB::getRevPattern()
 # Get the narrowest template pattern applicable to a passed CIDR address (may be a netblock or an IP)
 sub getRevPattern {
@@ -4695,4 +4695,48 @@
   return $revpatt;
 } # end getRevPattern()
+
+
+## DNSDB::getRevSet()
+# Return the unique per-IP reverse hostnames, if any, for the passed
+# CIDR address (may be a netblock or an IP)
+sub getRevSet {
+  my $self = shift;
+  my $dbh = $self->{dbh};
+  my $cidr = shift;
+  my $group = shift || 1;	# just in case
+
+  # for speed!  Casting and comparing even ~7K records takes ~2.5s, so narrow it down to one revzone first.
+  my ($revid) = $dbh->selectrow_array("SELECT rdns_id FROM revzones WHERE revnet >>= ?",
+	undef, ($cidr) );
+
+  $cidr = new NetAddr::IP $cidr;
+  if ($cidr->num > 256) {	# should also catch v6!
+    # Even reverse entries for a v4 /24 of IPs is a bit much.  I don't expect
+    # there to be a sane reason to retrive more than a /27 at once, really.
+    # v6 is going to be hairy no matter how you slice it.
+    $errstr = "Reverse hostname detail range too large";
+    return;
+  }
+
+  my $sth = $dbh->prepare("SELECT val, host FROM records ".
+	"WHERE (type in (12,65280,65281,65282,65283,65284)) AND rdns_id = ? AND inetlazy(val) = ?");
+
+  my @ret;
+  foreach my $ip (@{$cidr->splitref()}) {
+    $sth->execute($revid, $ip);
+    my @data = $sth->fetchrow_array();
+    my %row;
+    if (@data) {
+      $row{r_ip} = $data[0];
+      $row{iphost} = $data[1];
+    } else {
+      $row{r_ip} = $ip->addr;
+      $row{iphost} = '';
+    }
+    push @ret, \%row;
+  }
+
+  return \@ret;
+} # end getRevSet()
 
 
Index: trunk/dns-rpc.cgi
===================================================================
--- trunk/dns-rpc.cgi	(revision 672)
+++ trunk/dns-rpc.cgi	(revision 673)
@@ -92,4 +92,5 @@
 #sub getLogEntries {}
 	'dnsdb.getRevPattern'	=> \&getRevPattern,
+	'dnsdb.getRevSet'	=> \&getRevSet,
 	'dnsdb.getTypelist'	=> \&getTypelist,
 	'dnsdb.getTypemap'	=> \&getTypemap,
@@ -729,4 +730,12 @@
 }
 
+sub getRevSet {
+  my %args = @_;
+
+  _commoncheck(\%args, 'y');
+
+  return $dnsdb->getRevSet($args{cidr}, $args{group});
+}
+
 sub getTypelist {
   my %args = @_;
