X-Git-Url: http://lists.indexdata.com/cgi-bin?a=blobdiff_plain;f=perl%2Flib%2FIDZebra%2FSession.pm;h=a72e2291dead0acc67ef24f6f634c89029a407b0;hb=8e1d114f1969b19d12afc6ab0b04031e35ae5c88;hp=f68df57060c4ca1952165016f21b0cf285905553;hpb=a9d007b7f9024da4d8e04370fcb9063ec1816378;p=idzebra-moved-to-github.git diff --git a/perl/lib/IDZebra/Session.pm b/perl/lib/IDZebra/Session.pm index f68df57..a72e229 100644 --- a/perl/lib/IDZebra/Session.pm +++ b/perl/lib/IDZebra/Session.pm @@ -1,16 +1,22 @@ -# $Id: Session.pm,v 1.5 2003-02-28 18:38:29 pop Exp $ +# $Id: Session.pm,v 1.10 2003-03-03 18:27:25 pop Exp $ # # Zebra perl API header # ============================================================================= -use strict; package IDZebra::Session; -use IDZebra; -use IDZebra::Logger qw(:flags :calls); -use IDZebra::Resultset; -use Scalar::Util; -use Carp; + use strict; -our @ISA = qw(IDZebra::Logger); +use warnings; + + +BEGIN { + use IDZebra; + use Scalar::Util; + use IDZebra::Logger qw(:flags :calls); + use IDZebra::Resultset; + use IDZebra::RetrievalRecord; + our $VERSION = do { my @r = (q$Revision: 1.10 $ =~ /\d+/g); sprintf "%d."."%02d" x $#r, @r }; +# our @ISA = qw(IDZebra::Logger); +} 1; # ----------------------------------------------------------------------------- @@ -24,6 +30,7 @@ sub new { bless ($self, $class); $self->{cql_ct} = undef; + $self->{cql_mapfile} = ""; return ($self); $self->{databases} = {}; @@ -88,10 +95,25 @@ sub open { return ($self); } +sub checkzh { + my ($self) = @_; + unless (defined($self->{zh})) { + croak ("Zebra session is not opened"); + } +} + sub close { my ($self) = @_; if ($self->{zh}) { + + my $stats = 0; + # Delete all resulsets + my $r = IDZebra::deleteResultSet($self->{zh}, + 1, #Z_DeleteRequest_all, + 0,[], + $stats); + while (IDZebra::trans_no($self->{zh}) > 0) { logf (LOG_WARN,"Explicitly closing transaction with session"); $self->end_trans; @@ -124,12 +146,14 @@ sub DESTROY { if (defined ($self->{cql_ct})) { IDZebra::cql_transform_close($self->{cql_ct}); } + } # ----------------------------------------------------------------------------- # Record group selection This is a bit nasty... but used at many places # ----------------------------------------------------------------------------- sub group { my ($self,%args) = @_; + $self->checkzh; if ($#_ > 0) { $self->{rg} = $self->_makeRecordGroup(%args); $self->_selectRecordGroup($self->{rg}); @@ -139,6 +163,7 @@ sub group { sub selectRecordGroup { my ($self, $groupName) = @_; + $self->checkzh; $self->{rg} = $self->_getRecordGroup($groupName); $self->_selectRecordGroup($self->{rg}); } @@ -188,7 +213,7 @@ sub _getRecordGroup { my $r = IDZebra::init_recordGroup($rg); $rg->{groupName} = $groupName if ($groupName ne ""); $ext = "" unless ($ext); - my $r = IDZebra::res_get_recordGroup($self->{zh}, $rg, $ext); + $r = IDZebra::res_get_recordGroup($self->{zh}, $rg, $ext); return ($rg); } @@ -246,6 +271,8 @@ sub _selectRecordGroup { sub databases { my ($self, @databases) = @_; + $self->checkzh; + unless ($#_ >0) { return (keys(%{$self->{databases}})); } @@ -308,11 +335,13 @@ sub errAdd { # ----------------------------------------------------------------------------- sub begin_trans { my ($self) = @_; + $self->checkzh; IDZebra::begin_trans($self->{zh}); } sub end_trans { my ($self) = @_; + $self->checkzh; my $stat = IDZebra::ZebraTransactionStatus->new(); IDZebra::end_trans($self->{zh}, $stat); return ($stat); @@ -320,22 +349,26 @@ sub end_trans { sub begin_read { my ($self) =@_; + $self->checkzh; return(IDZebra::begin_read($self->{zh})); } sub end_read { my ($self) =@_; + $self->checkzh; IDZebra::end_read($self->{zh}); } sub shadow_enable { my ($self, $value) = @_; + $self->checkzh; if ($#_ > 0) { IDZebra::set_shadow_enable($self->{zh},$value); } return (IDZebra::get_shadow_enable($self->{zh})); } sub commit { my ($self) = @_; + $self->checkzh; if ($self->shadow_enable) { return(IDZebra::commit($self->{zh})); } @@ -357,16 +390,19 @@ sub odr_reset { # ----------------------------------------------------------------------------- sub init { my ($self) = @_; + $self->checkzh; return(IDZebra::init($self->{zh})); } sub compact { my ($self) = @_; + $self->checkzh; return(IDZebra::compact($self->{zh})); } sub update { my ($self, %args) = @_; + $self->checkzh; my $rg = $self->_update_args(%args); $self->_selectRecordGroup($rg); $self->begin_trans; @@ -377,6 +413,7 @@ sub update { sub delete { my ($self, %args) = @_; + $self->checkzh; my $rg = $self->_update_args(%args); $self->_selectRecordGroup($rg); $self->begin_trans; @@ -387,6 +424,7 @@ sub delete { sub show { my ($self, %args) = @_; + $self->checkzh; my $rg = $self->_update_args(%args); $self->_selectRecordGroup($rg); $self->begin_trans; @@ -408,12 +446,14 @@ sub _update_args { sub update_record { my ($self, %args) = @_; + $self->checkzh; return(IDZebra::update_record($self->{zh}, $self->_record_update_args(%args))); } sub delete_record { my ($self, %args) = @_; + $self->checkzh; return(IDZebra::delete_record($self->{zh}, $self->_record_update_args(%args))); } @@ -431,9 +471,9 @@ sub _record_update_args { $buff = $args{data}; } elsif ($args{file}) { - open (F, $args{file}) || warn ("Cannot open $args{file}"); + CORE::open (F, $args{file}) || warn ("Cannot open $args{file}"); $buff = join('',()); - close (F); + CORE::close (F); } my $len = length($buff); @@ -456,7 +496,6 @@ sub _record_update_args { $rg->{databaseName} = "Default" unless ($rg->{databaseName}); -# print STDERR "$rectype,$sysno,$match,$fname,$len\n"; unless ($rectype) { $rectype=""; } @@ -489,9 +528,11 @@ sub cql2pqf { } my $res = "\0" x 2048; my $r = IDZebra::cql2pqf($self->{cql_ct}, $cqlquery, $res, 2048); - unless ($r) {return (undef)}; + if ($r) { + carp ("Error transforming CQL query: '$cqlquery', status:$r"); + } $res=~s/\0.+$//g; - return ($res); + return ($res,$r); } @@ -501,6 +542,8 @@ sub cql2pqf { sub search { my ($self, %args) = @_; + $self->checkzh; + if ($args{cqlmap}) { $self->cqlmap($args{cqlmap}); } my $query; @@ -508,8 +551,11 @@ sub search { $query = $args{pqf}; } elsif ($args{cql}) { - unless ($query = $self->cql2pqf($args{cql})) { - croak ("Invalid CQL query: '$args{cql}'"); + my $cqlstat; + ($query, $cqlstat) = $self->cql2pqf($args{cql}); + unless ($query) { + croak ("Failed to transform query: '$args{cql}', ". + "status: ($cqlstat)"); } } unless ($query) { @@ -531,6 +577,15 @@ sub search { $self->databases(@origdbs); } + if ($args{sort}) { + if ($rs->errCode) { + carp("Sort skipped due to search error: ". + $rs->errCode); + } else { + $rs->sort($args{sort}); + } + } + return ($rs); } @@ -565,6 +620,12 @@ sub _search_pqf { sub sortResultsets { my ($self, $sortspec, $setname, @sets) = @_; + $self->checkzh; + + if ($#sets > 0) { + croak ("Sorting/merging of multiple resultsets is not supported now"); + } + my @setnames; my $count = 0; foreach my $rs (@sets) { @@ -582,6 +643,9 @@ sub sortResultsets { my $errCode = $self->errCode; my $errString = $self->errString; + logf (LOG_LOG, "Sort status $setname: %d, errCode: %d, errString: %s", + $status, $errCode, $errString); + if ($status || $errCode) {$count = 0;} my $rs = IDZebra::Resultset->new($self,