another alternative encoding for Crolist. How many does it have?
[webpac] / index_DBI_cache.pm
index ec3c038..df0e81b 100644 (file)
@@ -107,15 +107,16 @@ sub insert {
        }
 }
 
-sub check {
+sub count {
        my $self = shift;
 
        my $field = shift;
+       my $where = shift;
 
-       my $sql = "select count(*) from $field";
+       my $sql = "select count(*) from $field where upper(item) like upper(?)||'%'";
 
        my $sth = $self->{dbh}->prepare($sql) || die $self->{dbh}->errstr();
-       $sth->execute() || die "sql: $sql; ".$self->{dbh}->errstr();
+       $sth->execute($where) || die "sql: $sql; ".$self->{dbh}->errstr();
 
        my ($total) = $sth->fetchrow_array();
 
@@ -127,7 +128,6 @@ sub fetch {
        my $self = shift;
 
        my $field = shift;
-       my $what = shift || 'item';     # 'item,ident'
        my $where = shift;
 
        my $from_ord = shift || 0;
@@ -135,15 +135,24 @@ sub fetch {
 
        my @sql_args;
 
-       my $sql = "select $what,ord from $field";
+       my $sql = "select item,ord from $field";
 
        if ($where) {
-               my $sql2 = " select ord from $field where upper($what) like upper(?)||'%'";
+               my $sql2 = "select ord from $field where upper(item) like upper(?)||'%'";
                my $sth = $self->{dbh}->prepare($sql2) || die "sql2: $sql2; ".$self->{dbh}->errstr();
 
                $sth->execute($where) || die "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 $field where upper(item) like '%'||upper(?)||'%'";
+                       $sth = $self->{dbh}->prepare($sql2) || die "sql2: $sql2; ".$self->{dbh}->errstr();
+                       $sth->execute($where) || die "sql2: $sql2; ".$self->{dbh}->errstr();
+                       if (my $row = $sth->fetchrow_hashref) {
+                               $from_ord += $row->{ord} - 1;
+                       }
                }
        }
        $sql .= " order by ord limit $rows offset $from_ord";
@@ -178,7 +187,7 @@ sub close {
 
                my $ord = 0;
                foreach my $key (@keys) {
-                       $sth->execute($ord++,
+                       $sth->execute(++$ord,
                                $c_table->{$table}->{$key},
                                $c_count->{$table}->{$key}
                        );