--- trunk/index_DBI.pm 2003/01/22 20:24:32 11 +++ trunk/index_DBI.pm 2003/02/22 21:37:25 18 @@ -5,6 +5,7 @@ package index_DBI; use strict qw(vars); use vars qw($Count); +use HTML::Entities; use DBI; @@ -36,18 +37,18 @@ my $sql = "select count(*) from $field"; my $sth = $self->{dbh}->prepare($sql) || die $self->{dbh}->errstr(); # FIX: this is not a good way to check if table exists! - if (1 || $sth->execute() && $sth->fetchrow_hashref) { + if ($sth->execute() && $sth->fetchrow_hashref) { my $sql = "drop table $field"; -# my $sth = $self->{dbh}->do($sql) || die "SQL: $sql ".$self->{dbh}->errstr(); + my $sth = $self->{dbh}->do($sql) || die "SQL: $sql ".$self->{dbh}->errstr(); } $sql = "create table $field ( item varchar(255), ident varchar(255), count int, + ord int, primary key (item,ident) )"; -# $sth = $self->{dbh}->do($sql) || die "SQL: $sql ".$self->{dbh}->errstr(); - $sth = $self->{dbh}->do($sql) || warn "SQL: $sql ".$self->{dbh}->errstr(); + $sth = $self->{dbh}->do($sql); # || warn "SQL: $sql ".$self->{dbh}->errstr(); $self->{dbh}->commit; $self->{dbh}->begin_work; @@ -57,8 +58,8 @@ my $self = shift; my $field = shift; - my $index_data = shift; - my $ident = shift; # e.g. library id + my $index_data = shift || print STDERR "\$index->insert($field,NULL,...)"; + my $ident = shift || ''; # e.g. library id if (! $index_data) { print STDERR "\$index->insert() -- no value to insert\n"; @@ -91,7 +92,13 @@ my $field = shift; my $sql = "select count(*) from $field"; - return $self->{dbh}->do($sql); + + my $sth = $self->{dbh}->prepare($sql) || die $self->{dbh}->errstr(); + $sth->execute() || die "sql: $sql; ".$self->{dbh}->errstr(); + + my ($total) = $sth->fetchrow_array(); + + return $total; } @@ -102,19 +109,29 @@ my $what = shift || 'item'; # 'item,ident' my $where = shift; + my $from_ord = shift || 0; + my $rows = shift || 10; + my @sql_args; - my $sql = "select $what from $field"; + my $sql = "select $what,ord from $field"; + if ($where) { - $sql .= " where upper(item) like upper(?)||'%'"; - push @sql_args,$where; + my $sql2 = " select ord from $field where upper($what) 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; + } } - $sql .= " order by item"; + $sql .= " order by ord limit $rows offset $from_ord"; - my $sth = $self->{dbh}->prepare($sql) || die "sql: $sql; ".$self->{dbh}->errstr(); - $sth->execute(@sql_args) || die "sql: $sql; ".$self->{dbh}->errstr(); + my $sth = $self->{dbh}->prepare($sql) || die "prepare: $sql; ".$self->{dbh}->errstr(); + $sth->execute() || die "execute: $sql; ".$self->{dbh}->errstr(); my @arr; while (my $row = $sth->fetchrow_hashref) { + $row->{item} = HTML::Entities::encode($row->{item}); push @arr,$row; } return @arr; @@ -123,8 +140,39 @@ sub close { my $self = shift; + + # re-create ord column (sorted order) in table + sub create_ord { + + my $table = shift; + + $self->{dbh}->begin_work || die $self->{dbh}->errstr(); + + my $sql = "select oid from $table order by item"; + my $sth = $self->{dbh}->prepare($sql) || die "sql: $sql; ".$self->{dbh}->errstr(); + $sql = "update $table set ord=? where oid=?"; + my $sth_update = $self->{dbh}->prepare($sql) || die "sql: $sql; ".$self->{dbh}->errstr(); + $sth->execute() || die "sql: $sql; ".$self->{dbh}->errstr(); + my $ord = 1; + while (my $row = $sth->fetchrow_hashref) { + $sth_update->execute($ord++,$row->{oid}); + } + + $self->{dbh}->commit || die $self->{dbh}->errstr(); + } + #--- end of sub + if ($self->{dbh}) { + + # commit $self->{dbh}->commit || die $self->{dbh}->errstr(); + + foreach my $table (keys %Table) { +# FIX +print STDERR "creating ord for $table...\n"; + create_ord($table); + } + $self->{dbh}->disconnect; undef $self->{dbh}; }