X-Git-Url: http://git.rot13.org/?p=webpac;a=blobdiff_plain;f=index_DBI.pm;h=c366976494f7f0a05164832fcfd1fd1c3a0e5f56;hp=08a922a6cdae1c0ec8e954128ed5cf3d3df80048;hb=fc619af8ede79fde1f53aca67ab9bbbcf84c645f;hpb=9ddd5ea98a26e19996647e5baf9b3b0b8097eefe diff --git a/index_DBI.pm b/index_DBI.pm index 08a922a..c366976 100644 --- a/index_DBI.pm +++ b/index_DBI.pm @@ -10,14 +10,19 @@ use HTML::Entities; use DBI; my %Table; # index tables which where visited in this run +my %sth_cache; # cache prepared statements sub new { my $class = shift; my $self = {}; bless($self, $class); - # FIX: config params - $self->{dbh} = DBI->connect("DBI:Pg:dbname=webpac","dpavlin","") || die $DBI::errstr; + my $dbd = shift || die "need dbi_dbd= in [global] section of configuration file"; + my $dsn = shift || die "need dbi_dsn= in [global] section of configuration file"; + my $user = shift || die "need dbi_user= in [global] section of configuration file"; + my $passwd = shift || die "need dbi_passwd= in [global] section of configuration file"; + + $self->{dbh} = DBI->connect("DBI:$dbd:$dsn",$user,$passwd) || die $DBI::errstr; # begin transaction $self->{dbh}->begin_work || die $self->{dbh}->errstr(); @@ -73,21 +78,25 @@ sub insert { if (! $Table{$field}) { $self->delete_and_create($field); + + my $sql = "select item from $field where upper(item)=upper(?)"; + $sth_cache{$field."select"} = $self->{dbh}->prepare($sql) || die $self->{dbh}->errstr(); + + $sql = "insert into $field (item,ident,count) values (?,?,?)"; + $sth_cache{$field."insert"} = $self->{dbh}->prepare($sql) || die $self->{dbh}->errstr(); + + $sql = "update $field set count = count + 1 where item = ? and ident = ?"; + $sth_cache{$field."update"} = $self->{dbh}->prepare($sql) || die $self->{dbh}->errstr(); } $Table{$field}++; - my $sql = "select item from $field where upper(item)=upper(?)"; - my $sth = $self->{dbh}->prepare($sql) || die $self->{dbh}->errstr(); - $sth->execute($index_data) || die "sql: $sql; ".$self->{dbh}->errstr(); - if (! $sth->fetchrow_hashref) { - my $sql = "insert into $field (item,ident,count) values (?,?,?)"; - my $sth = $self->{dbh}->prepare($sql) || die $self->{dbh}->errstr(); - $sth->execute($index_data,$ident,1) || die "sql: $sql; ".$self->{dbh}->errstr(); + $sth_cache{$field."select"}->execute($index_data) || die "cache: $field select; ".$self->{dbh}->errstr(); + if (! $sth_cache{$field."select"}->fetchrow_hashref) { + $index_data = substr($index_data,0,255); + $sth_cache{$field."insert"}->execute($index_data,$ident,1) || die "cache: $field insert; ".$self->{dbh}->errstr(); #print stderr "in index: $index_data\n"; } else { - my $sql = "update $field set count = count + 1 where item = ? and ident = ?"; - my $sth = $self->{dbh}->prepare($sql) || die $self->{dbh}->errstr(); - $sth->execute($index_data,$ident) || die "sql: $sql; ".$self->{dbh}->errstr(); + $sth_cache{$field."update"}->execute($index_data,$ident) || die "cache: $field update; ".$self->{dbh}->errstr(); } } @@ -136,7 +145,7 @@ sub fetch { $sth->execute() || die "execute: $sql; ".$self->{dbh}->errstr(); my @arr; while (my $row = $sth->fetchrow_hashref) { - $row->{item} = HTML::Entities::encode($row->{item}); + $row->{item} = HTML::Entities::encode($row->{item},'<>&"'); push @arr,$row; } return @arr; @@ -153,7 +162,7 @@ sub close { $self->{dbh}->begin_work || die $self->{dbh}->errstr(); - my $sql = "select oid from $table order by item"; + my $sql = "select oid from $table order by upper(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(); @@ -176,6 +185,9 @@ sub close { # FIX print STDERR "creating ord for $table...\n"; create_ord($table); + undef $sth_cache{$table."select"}; + undef $sth_cache{$table."insert"}; + undef $sth_cache{$table."update"}; } $self->{dbh}->disconnect;