Added sorting, +tests. documentation is needed.
[idzebra-moved-to-github.git] / perl / lib / IDZebra / Session.pm
index f68df57..a72e229 100644 (file)
@@ -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('',(<F>));
-       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,