299 lines
8.8 KiB
Perl
299 lines
8.8 KiB
Perl
package C4::Authorities;
|
|
|
|
# $Id$
|
|
|
|
# Copyright 2000-2002 Katipo Communications
|
|
#
|
|
# This file is part of Koha.
|
|
#
|
|
# Koha is free software; you can redistribute it and/or modify it under the
|
|
# terms of the GNU General Public License as published by the Free Software
|
|
# Foundation; either version 2 of the License, or (at your option) any later
|
|
# version.
|
|
#
|
|
# Koha is distributed in the hope that it will be useful, but WITHOUT ANY
|
|
# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
|
|
# A PARTICULAR PURPOSE. See the GNU General Public License for more details.
|
|
#
|
|
# You should have received a copy of the GNU General Public License along with
|
|
# Koha; if not, write to the Free Software Foundation, Inc., 59 Temple Place,
|
|
# Suite 330, Boston, MA 02111-1307 USA
|
|
|
|
use strict;
|
|
require Exporter;
|
|
use DBI;
|
|
use C4::Context;
|
|
use vars qw($VERSION @ISA @EXPORT);
|
|
|
|
# set the version for version checking
|
|
$VERSION = 0.01;
|
|
|
|
=head1 NAME
|
|
|
|
C4::Accounts - Functions for dealing with Koha authorities
|
|
|
|
=head1 SYNOPSIS
|
|
|
|
use C4::Authorities;
|
|
|
|
=head1 DESCRIPTION
|
|
|
|
The functions in this module deal with the authorities table in koha.
|
|
It contains every functions to manage/find authorities.
|
|
|
|
=head1 FUNCTIONS
|
|
|
|
=over 2
|
|
|
|
=cut
|
|
|
|
@ISA = qw(Exporter);
|
|
@EXPORT = qw( &newauthority
|
|
&searchauthority
|
|
&delauthority
|
|
&modauthority
|
|
&SearchDeeper
|
|
);
|
|
|
|
=item newauthority
|
|
|
|
$id = &newauthority($dbh,$category,$stdlib,$freelib,$father,$level,$hierarchy);
|
|
|
|
adds an authority entry in the db.
|
|
It calculates the level of the authority with the authoritysep and the complete hierarchy.
|
|
|
|
C<$dbh> is a DBI::db handle for the Koha database.
|
|
C<$category> is the category of the entry
|
|
C<$stdlib> is the authority form to be created
|
|
C<$freelib> is a free form for the authority
|
|
C<$father> is the father in case of creation of a thesaurus sub-entry
|
|
C<$level> is the level of the entry (1 being the 1st thasaurus level)
|
|
C<$hierarchy> is the id of all the fathers of the enty.
|
|
|
|
Note :
|
|
you can safely pass a full hierarchy without testing the existence of the father.
|
|
As many father, grand-father... as needed are created.
|
|
|
|
Usually, this function is called with '',1,'' as the 3 lasts parameters.
|
|
if not provided, it's the default value.
|
|
|
|
The function is recursive
|
|
|
|
The function uses the authoritysep defined in systempreferences table to split the lib.
|
|
|
|
=cut
|
|
|
|
sub newauthority {
|
|
my ($dbh,$category,$stdlib,$freelib,$father,$level,$hierarchy)=@_;
|
|
exit unless ($stdlib);
|
|
$level=1 unless $level;
|
|
$freelib = $stdlib unless ($freelib);
|
|
my $dbh = C4::Context->dbh;
|
|
my $sth1b=$dbh->prepare("select id from bibliothesaurus where freelib=? and hierarchy=? and category=?");
|
|
my $sth2 =$dbh->prepare("insert into bibliothesaurus (category,stdlib,freelib,father,level,hierarchy) values (?,?,?,?,?,?)");
|
|
$freelib=$stdlib unless ($freelib);
|
|
my $authoritysep = C4::Context->preference('authoritysep');
|
|
my @Thierarchy = split(/$authoritysep/,$stdlib);
|
|
#---- split freelib. If not same structure as stdlib (different number of authoritysep),
|
|
#---- then, drop it => we will use stdlib to build hiearchy, freelib will be used only for last occurence.
|
|
my @Fhierarchy = split(/$authoritysep/,$freelib);
|
|
if ($#Fhierarchy eq 0) {
|
|
$#Fhierarchy=-1;
|
|
}
|
|
for (my $xi=0;$xi<$#Thierarchy;$xi++) {
|
|
$Thierarchy[$xi] =~ s/^\s+//;
|
|
$Thierarchy[$xi] =~ s/\s+$//;
|
|
my $x = &newauthority($dbh,$category,$Thierarchy[$xi],$Fhierarchy[$xi]?$Fhierarchy[$xi]:$Thierarchy[$xi],$father,$level,$hierarchy);
|
|
$father .= $Thierarchy[$xi]." $authoritysep ";
|
|
$hierarchy .= "$x|" if ($x);
|
|
$level++;
|
|
}
|
|
my $id;
|
|
if ($#Thierarchy >=0) {
|
|
# free form
|
|
$hierarchy='' unless $hierarchy;
|
|
$sth1b->execute($freelib,$hierarchy,$category);
|
|
($id) = $sth1b->fetchrow;
|
|
unless ($id) {
|
|
$Thierarchy[$#Thierarchy] =~ s/^\s+//;
|
|
$Thierarchy[$#Thierarchy] =~ s/\s+$//;
|
|
$Fhierarchy[$#Fhierarchy] =~ s/^\s+// if ($#Fhierarchy>=0);
|
|
$Fhierarchy[$#Fhierarchy] =~ s/\s+$// if ($#Fhierarchy>=0);
|
|
$freelib =~ s/\s+$//;
|
|
$sth2->execute($category,$Thierarchy[$#Thierarchy],$#Fhierarchy==$#Thierarchy?$Fhierarchy[$#Fhierarchy]:$freelib,$father,$level,$hierarchy);
|
|
} else {
|
|
}
|
|
# authority form
|
|
$sth1b->execute($Thierarchy[$#Thierarchy],$hierarchy,$category);
|
|
($id) = $sth1b->fetchrow;
|
|
unless ($id) {
|
|
$Thierarchy[$#Thierarchy] =~ s/^\s+//;
|
|
$Thierarchy[$#Thierarchy] =~ s/\s+$//;
|
|
$sth1b->execute($stdlib,$hierarchy,$category);
|
|
($id) = $sth1b->fetchrow;
|
|
unless ($id) {
|
|
$sth2->execute($category,$Thierarchy[$#Thierarchy],$Thierarchy[$#Thierarchy],$father,$level,$hierarchy);
|
|
}
|
|
}
|
|
}
|
|
return $id;
|
|
}
|
|
|
|
=item ModAuthority
|
|
|
|
$id = &ModAuthority($dbh,$id,$freelib);
|
|
|
|
modify a free lib
|
|
|
|
C<$dbh> is a DBI::db handle for the Koha database.
|
|
C<$id> is the entry id
|
|
C<$freelib> is the new freelib
|
|
|
|
=cut
|
|
sub modauthority {
|
|
my ($dbh,$id,$freelib) = @_;
|
|
my $sth = $dbh->prepare("update bibliothesaurus set freelib=? where id=?");
|
|
$sth->execute($freelib,$id);
|
|
}
|
|
|
|
=item SearchAuthority
|
|
|
|
($count, \@array) = &SearchAuthority($dbh,$category,$branch,$searchstring,$type,$offset,$pagesize);
|
|
|
|
searches for an authority
|
|
|
|
C<$dbh> is a DBI::db handle for the Koha database.
|
|
|
|
C<$category> is the category of the authority
|
|
|
|
C<$branch> can contain a branch hierarchy. For example, if C<$branch> contains 1024|2345, SearchAuthority will return only
|
|
entries beginning by 1024|2345
|
|
|
|
C<$searchstring> contains a string. Only entries beginning by C<$searchstring> are returned
|
|
|
|
return :
|
|
C<$count> : the number of authorities found
|
|
C<\@array> : the authorities found. The array contains stdlib,freelib,father,id,hierarchy and level
|
|
|
|
=cut
|
|
sub searchauthority {
|
|
my ($env,$category,$branch,$searchstring,$offset,$pagesize)=@_;
|
|
$offset=0 unless ($offset);
|
|
# warn "==> ($env,$category,$branch,$searchstring,$offset,$pagesize)";
|
|
my $dbh = C4::Context->dbh;
|
|
my $query="Select stdlib,freelib,father,id,hierarchy,level from bibliothesaurus where category=?";
|
|
my @bind=($category);
|
|
if ($branch) {
|
|
$query .= " and hierarchy=?";
|
|
push(@bind,$branch);
|
|
}
|
|
if ($searchstring) {
|
|
$query .= " and match (category,freelib) AGAINST (?)";
|
|
push(@bind,$searchstring);
|
|
}
|
|
# $query .= " and freelib like \"$searchstring%\"" if ($searchstring);
|
|
$query .= " limit ?,?";
|
|
push(@bind,$offset,($pagesize*4));
|
|
warn "q : $query".@bind;
|
|
my $sth=$dbh->prepare($query);
|
|
$sth->execute(@bind);
|
|
my @results;
|
|
my $old_stdlib="";
|
|
while (my $data=$sth->fetchrow_hashref){
|
|
push(@results,$data);
|
|
}
|
|
$sth->finish;
|
|
$query="Select count(*) from bibliothesaurus where category =?";
|
|
@bind=($category);
|
|
if ($branch) {
|
|
$query .= " and hierarchy=?";
|
|
push(@bind,$branch);
|
|
}
|
|
if ($searchstring) {
|
|
$query .= " and stdlib like ?";
|
|
push(@bind,"$searchstring%");
|
|
}
|
|
$sth=$dbh->prepare($query);
|
|
$sth->execute(@bind);
|
|
my ($cnt) = $sth->fetchrow;
|
|
$cnt = $pagesize+1 if ($cnt>$pagesize);
|
|
$sth->finish();
|
|
return ($#results,\@results);
|
|
}
|
|
|
|
=item SearchDeeper
|
|
|
|
@array = &SearchAuthority($dbh,$category,$father);
|
|
|
|
Finds everything depending on the parameter.
|
|
|
|
C<$dbh> is a DBI::db handle for the Koha database.
|
|
|
|
C<$category> is the category of the authority
|
|
|
|
C<$father> Is the string "father".
|
|
|
|
return :
|
|
@array : the authorities found. The array contains stdlib,freelib,father,id,hierarchy and level
|
|
|
|
For example :
|
|
Geography -- Europe is the father and the result is : France and Germany if there is
|
|
Geography -- Europe -- France and Geography -- Europe -- Germany in the thesaurus
|
|
|
|
|
|
=cut
|
|
sub SearchDeeper {
|
|
my ($category,$father)=@_;
|
|
my $dbh = C4::Context->dbh;
|
|
my $sth=$dbh->prepare("Select distinct level,stdlib,father from bibliothesaurus where category =? and father =? order by category,stdlib");
|
|
$sth->execute($category,"$father --");
|
|
my @results;
|
|
while (my ($level,$stdlib,$father)=$sth->fetchrow){
|
|
my %line;
|
|
$line{level} = $level;
|
|
$line{stdlib}= $stdlib;
|
|
$line{father} = $father;
|
|
push(@results,\%line);
|
|
}
|
|
$sth->finish;
|
|
return (@results);
|
|
}
|
|
|
|
|
|
=item delauthority
|
|
|
|
$id = &delauthority($id);
|
|
|
|
delete an authority and all it's "childs" and "related"
|
|
|
|
C<$id> is the id of the authority
|
|
|
|
=cut
|
|
sub delauthority {
|
|
my ($id) = @_;
|
|
my $dbh = C4::Context->dbh;
|
|
# we must delete : - the id, every sons from the id.
|
|
# to do this, we can : reconstruct the full hierarchy of the id and delete with hierarchy as a key.
|
|
my $sth=$dbh->prepare("select hierarchy from bibliothesaurus where id=?");
|
|
$sth->execute($id);
|
|
my ($hierarchy) = $sth->fetchrow;
|
|
if ($hierarchy) {
|
|
$dbh->do("delete from bibliothesaurus where hierarchy like '$hierarchy|$id|%'");
|
|
# warn("delete from bibliothesaurus where hierarchy like '$hierarchy|$id|%'");
|
|
} else {
|
|
$dbh->do("delete from bibliothesaurus where hierarchy like '$id|%'");
|
|
# warn("delete from bibliothesaurus where hierarchy like '$id|%'");
|
|
}
|
|
# warn("delete from bibliothesaurus where id='$id|'");
|
|
$dbh->do("delete from bibliothesaurus where id='$id|'");
|
|
}
|
|
END { } # module clean-up code here (global destructor)
|
|
|
|
1;
|
|
__END__
|
|
|
|
=back
|
|
|
|
=head1 SEE ALSO
|
|
|
|
=cut
|