don't die if ISIS database is not found, just go to next one
[webpac] / index_DBI_filter.pm
index 5ac3208..fadeea9 100644 (file)
@@ -117,24 +117,52 @@ sub count {
        my $field = shift;
        my $where = shift;
 
-       my $sql = "select count(*) from index where name = ? and upper(item) like upper(?)||'%'";
+       my $filter = shift;
+
+       my $tables_sql = 'index';
+       my $where_sql = '';
+       my @sql_args = ( $field, $where );
+
+       if ($filter) {
+               $tables_sql .= ",filters";
+               $where_sql .= "
+                       and index.ord = filters.ord
+                       and filter = ?
+               ";
+               push @sql_args, $filter;
+       }
+
+       my $sql = qq{
+               select count(*)
+               from $tables_sql
+               where name = ? and upper(item) like upper(?)||'%'
+               $where_sql
+       };
 
-       my $sth = $self->{dbh}->prepare($sql) || die $self->{dbh}->errstr();
-       $sth->execute($field,$where) || die "sql: $sql; ".$self->{dbh}->errstr();
+       my $sth = $self->{dbh}->prepare($sql) || confess $self->{dbh}->errstr();
+       $sth->execute(@sql_args) || confess "sql: $sql; ".$self->{dbh}->errstr();
 
        my ($total) = $sth->fetchrow_array();
 
        # no results, count all
        if (! $total) {
-               my $sql = "select count(*) from index wheere name = ?";
-
-               my $sth = $self->{dbh}->prepare($sql) || die $self->{dbh}->errstr();
-               $sth->execute($field) || die "sql: $sql; ".$self->{dbh}->errstr();
+               my $sql = qq{
+                       select count(*)
+                       from $tables_sql
+                       where index.name = ?
+                       $where_sql
+               };
+
+               @sql_args = ( $field );
+               push @sql_args, $filter if ($filter);
+
+               my $sth = $self->{dbh}->prepare($sql) || confess $self->{dbh}->errstr();
+               $sth->execute(@sql_args) || confess "sql: $sql; ".$self->{dbh}->errstr();
                $total = $sth->fetchrow_array();
 
        }
 
-       return $total || 1;
+       return $total || '0';
 }
 
 
@@ -146,40 +174,71 @@ sub fetch {
 
        my $offset = shift || 0;
        my $rows = shift || 10;
+       my $filter = shift;
+
        my $from_ord = 0;
 
-       my @sql_args;
+       my $tables_sql = 'index';
+       my $where_sql = '';
 
-       my $sql = qq{
-               select item,display,count
-               from index
-               where name = ?
-               and ord > ?
-               order by ord
-               limit ? offset ?
-       };
+       my @sql_args = ( $field, $where );
 
-       if ($where) {
-               my $sql2 = "select ord from index where name = ? and upper(item) like upper(?)||'%'";
-               my $sth = $self->{dbh}->prepare($sql2) || die "sql2: $sql2; ".$self->{dbh}->errstr();
+       if ($filter) {
+               $tables_sql .= ",filters";
+               $where_sql .= "
+                       and index.ord = filters.ord
+                       and filter = ?
+               ";
+               push @sql_args, $filter;
+       }
 
-               $sth->execute($field, $where) || die "sql2: $sql2; ".$self->{dbh}->errstr();
+       if ($where) {
+               my $sql2 = qq{
+                       select index.ord as ord
+                       from $tables_sql
+                       where name = ? and upper(item) like upper(?)||'%'
+                       $where_sql
+               };
+               my $sth = $self->{dbh}->prepare($sql2) || confess "sql2: $sql2; ".$self->{dbh}->errstr();
+
+               $sth->execute(@sql_args) || confess "sql2: $sql2; ".$self->{dbh}->errstr();
                if (my $row = $sth->fetchrow_hashref) {
                        $from_ord += $row->{ord} - 1;
                } else {
                        # if no match is found when searching from beginning
                        # of word in index, try substring match anywhere
-                       $sql2 = "select ord from index where name = ? and upper(item) like '% '||upper(?)||'%'";
-                       $sth = $self->{dbh}->prepare($sql2) || die "sql2: $sql2; ".$self->{dbh}->errstr();
-                       $sth->execute($field, $where) || die "sql2: $sql2; ".$self->{dbh}->errstr();
+                       $sql2 = qq{
+                               select index.ord as ord
+                               from $tables_sql
+                               where name = ? and upper(item) like '% '||upper(?)||'%'
+                               $where_sql
+                       };
+       
+                       $sth = $self->{dbh}->prepare($sql2) || confess "sql2: $sql2; ".$self->{dbh}->errstr();
+                       $sth->execute(@sql_args) || confess "sql2: $sql2; ".$self->{dbh}->errstr();
+
                        if (my $row = $sth->fetchrow_hashref) {
                                $from_ord += $row->{ord} - 1;
                        }
                }
        }
 
-       my $sth = $self->{dbh}->prepare($sql) || die "prepare: $sql; ".$self->{dbh}->errstr();
-       $sth->execute($field,$from_ord,$rows,$offset) || die "execute: $sql; ".$self->{dbh}->errstr();
+       @sql_args = ( $field, $from_ord );
+       push @sql_args, $filter if ($filter);
+       push @sql_args, ( $rows, $offset );
+
+       my $sql = qq{
+               select item,display,index.count as count
+               from $tables_sql
+               where name = ?
+                       and index.ord > ?
+               $where_sql
+                       order by index.ord
+                       limit ? offset ?
+       };
+
+       my $sth = $self->{dbh}->prepare($sql) || confess "prepare: $sql; ".$self->{dbh}->errstr();
+       $sth->execute(@sql_args) || confess "execute: $sql; ".$self->{dbh}->errstr();
        my @arr;
        while (my $row = $sth->fetchrow_hashref) {
                $row->{item} = HTML::Entities::encode($row->{item},' <>&"');
@@ -196,7 +255,7 @@ sub close {
 
        return if (! $self->{dbh});
 
-       $self->{dbh}->begin_work || die $self->{dbh}->errstr();
+       $self->{dbh}->begin_work || confess $self->{dbh}->errstr();
 
        $self->delete_and_create('index', qq{
                create table index (
@@ -253,7 +312,7 @@ sub close {
 
        }
 
-       $self->{dbh}->commit || die $self->{dbh}->errstr();
+       $self->{dbh}->commit || confess $self->{dbh}->errstr();
 
        $self->bench("vacuuming");