/[webpac]/trunk2/lib/WebPac/Index.pm
This is repository of my old source code which isn't updated any more. Go to git.rot13.org for current projects!
ViewVC logotype

Diff of /trunk2/lib/WebPac/Index.pm

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 94 by dpavlin, Sun Jul 13 19:30:28 2003 UTC revision 201 by dpavlin, Sat Jan 17 14:00:26 2004 UTC
# Line 10  package index_DBI; Line 10  package index_DBI;
10  use strict qw(vars);  use strict qw(vars);
11  use vars qw($Count);  use vars qw($Count);
12  use HTML::Entities;  use HTML::Entities;
13    use URI::Escape;
14    use locale;
15    
16  use DBI;  use DBI;
17    
# Line 66  sub delete_and_create { Line 68  sub delete_and_create {
68          }          }
69          $sql = "create table $field (          $sql = "create table $field (
70                          item varchar(255),                          item varchar(255),
71                            display text,
72                          count int,                          count int,
73                          ord int,                          ord int,
74                          primary key (item)                          primary key (item)
# Line 79  sub insert { Line 82  sub insert {
82    
83          my $field = shift;          my $field = shift;
84          my $index_data = shift || print STDERR "\$index->insert($field,NULL,...)";          my $index_data = shift || print STDERR "\$index->insert($field,NULL,...)";
85          my $ident = shift || '';        # e.g. library id          my $display = shift || $index_data;
86    
87          if (! $index_data) {          if (! $index_data) {
88                  print STDERR "\$index->insert() -- no value to insert\n";                  print STDERR "\$index->insert() -- no value to insert\n";
# Line 101  sub insert { Line 104  sub insert {
104          if (! $c_table->{$field}->{$uc}) {          if (! $c_table->{$field}->{$uc}) {
105  #print stderr "in index: $index_data\n";  #print stderr "in index: $index_data\n";
106                  $c_table->{$field}->{$uc} = $index_data;                  $c_table->{$field}->{$uc} = $index_data;
107                    $c_table->{$field}->{$uc}->{display} = $display;
108                  $c_count->{$field}->{$uc} = 1;                  $c_count->{$field}->{$uc} = 1;
109          } else {          } else {
110                  $c_count->{$field}->{$uc}++;                  $c_count->{$field}->{$uc}++;
111          }          }
112  }  }
113    
114  sub check {  sub count {
115          my $self = shift;          my $self = shift;
116    
117          my $field = shift;          my $field = shift;
118            my $where = shift;
119    
120          my $sql = "select count(*) from $field";          my $sql = "select count(*) from $field where upper(item) like upper(?)||'%'";
121    
122          my $sth = $self->{dbh}->prepare($sql) || die $self->{dbh}->errstr();          my $sth = $self->{dbh}->prepare($sql) || die $self->{dbh}->errstr();
123          $sth->execute() || die "sql: $sql; ".$self->{dbh}->errstr();          $sth->execute($where) || die "sql: $sql; ".$self->{dbh}->errstr();
124    
125          my ($total) = $sth->fetchrow_array();          my ($total) = $sth->fetchrow_array();
126    
127          return $total;          # no results, count all
128            if (! $total) {
129                    my $sql = "select count(*) from $field";
130    
131                    my $sth = $self->{dbh}->prepare($sql) || die $self->{dbh}->errstr();
132                    $sth->execute() || die "sql: $sql; ".$self->{dbh}->errstr();
133                    $total = $sth->fetchrow_array();
134    
135            }
136    
137            return $total || 1;
138  }  }
139    
140    
# Line 127  sub fetch { Line 142  sub fetch {
142          my $self = shift;          my $self = shift;
143    
144          my $field = shift;          my $field = shift;
         my $what = shift || 'item';     # 'item,ident'  
145          my $where = shift;          my $where = shift;
146    
147          my $from_ord = shift || 0;          my $from_ord = shift || 0;
# Line 135  sub fetch { Line 149  sub fetch {
149    
150          my @sql_args;          my @sql_args;
151    
152          my $sql = "select $what,ord from $field";          my $sql = "select item,display,ord from $field";
153    
154          if ($where) {          if ($where) {
155                  my $sql2 = " select ord from $field where upper($what) like upper(?)||'%'";                  my $sql2 = "select ord from $field where upper(item) like upper(?)||'%'";
156                  my $sth = $self->{dbh}->prepare($sql2) || die "sql2: $sql2; ".$self->{dbh}->errstr();                  my $sth = $self->{dbh}->prepare($sql2) || die "sql2: $sql2; ".$self->{dbh}->errstr();
157    
158                  $sth->execute($where) || die "sql2: $sql2; ".$self->{dbh}->errstr();                  $sth->execute($where) || die "sql2: $sql2; ".$self->{dbh}->errstr();
159                  if (my $row = $sth->fetchrow_hashref) {                  if (my $row = $sth->fetchrow_hashref) {
160                          $from_ord += $row->{ord} - 1;                          $from_ord += $row->{ord} - 1;
161                    } else {
162                            # if no match is found when searching from beginning
163                            # of word in index, try substring match anywhere
164                            $sql2 = "select ord from $field where upper(item) like '% '||upper(?)||'%'";
165                            $sth = $self->{dbh}->prepare($sql2) || die "sql2: $sql2; ".$self->{dbh}->errstr();
166                            $sth->execute($where) || die "sql2: $sql2; ".$self->{dbh}->errstr();
167                            if (my $row = $sth->fetchrow_hashref) {
168                                    $from_ord += $row->{ord} - 1;
169                            }
170                  }                  }
171          }          }
172          $sql .= " order by ord limit $rows offset $from_ord";          $sql .= " order by ord limit $rows offset $from_ord";
# Line 152  sub fetch { Line 175  sub fetch {
175          $sth->execute() || die "execute: $sql; ".$self->{dbh}->errstr();          $sth->execute() || die "execute: $sql; ".$self->{dbh}->errstr();
176          my @arr;          my @arr;
177          while (my $row = $sth->fetchrow_hashref) {          while (my $row = $sth->fetchrow_hashref) {
178                  $row->{item} = HTML::Entities::encode($row->{item},'<>&"');                  $row->{item} = HTML::Entities::encode($row->{item},' <>&"');
179                    $row->{display} = HTML::Entities::encode($row->{display},'<>&"');
180                  push @arr,$row;                  push @arr,$row;
181          }          }
182          return @arr;          return @arr;
# Line 173  sub close { Line 197  sub close {
197                  my @keys = sort keys %{$c_table->{$table}};                  my @keys = sort keys %{$c_table->{$table}};
198    
199                  $self->bench("Dumping data into $table");                  $self->bench("Dumping data into $table");
200                  my $sql = "insert into $table (ord,item,count) values (?,?,?)";                  my $sql = "insert into $table (ord,item,display,count) values (?,?,?,?)";
201                  my $sth = $self->{dbh}->prepare($sql) || die "sql: $sql; ".$self->{dbh}->errstr();                  my $sth = $self->{dbh}->prepare($sql) || die "sql: $sql; ".$self->{dbh}->errstr();
202    
203                  my $ord = 0;                  my $ord = 0;
204                  foreach my $key (@keys) {                  foreach my $key (@keys) {
205                          $sth->execute($ord++,                          $sth->execute(++$ord,
206                                  $c_table->{$table}->{$key},                                  $c_table->{$table}->{$key},
207                                    $c_table->{$table}->{$key}->{display},
208                                  $c_count->{$table}->{$key}                                  $c_count->{$table}->{$key}
209                          );                          );
210                  }                  }

Legend:
Removed from v.94  
changed lines
  Added in v.201

  ViewVC Help
Powered by ViewVC 1.1.26