-# $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;
# -----------------------------------------------------------------------------
bless ($self, $class);
$self->{cql_ct} = undef;
+ $self->{cql_mapfile} = "";
return ($self);
$self->{databases} = {};
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;
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});
sub selectRecordGroup {
my ($self, $groupName) = @_;
+ $self->checkzh;
$self->{rg} = $self->_getRecordGroup($groupName);
$self->_selectRecordGroup($self->{rg});
}
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);
}
sub databases {
my ($self, @databases) = @_;
+ $self->checkzh;
+
unless ($#_ >0) {
return (keys(%{$self->{databases}}));
}
# -----------------------------------------------------------------------------
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);
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}));
}
# -----------------------------------------------------------------------------
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;
sub delete {
my ($self, %args) = @_;
+ $self->checkzh;
my $rg = $self->_update_args(%args);
$self->_selectRecordGroup($rg);
$self->begin_trans;
sub show {
my ($self, %args) = @_;
+ $self->checkzh;
my $rg = $self->_update_args(%args);
$self->_selectRecordGroup($rg);
$self->begin_trans;
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)));
}
$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);
$rg->{databaseName} = "Default" unless ($rg->{databaseName});
-# print STDERR "$rectype,$sysno,$match,$fname,$len\n";
unless ($rectype) {
$rectype="";
}
}
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);
}
sub search {
my ($self, %args) = @_;
+ $self->checkzh;
+
if ($args{cqlmap}) { $self->cqlmap($args{cqlmap}); }
my $query;
$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) {
$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);
}
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) {
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,