@EXPORT = qw(
&updateBiblio &updateBiblioItem &updateItem
&itemcount &newbiblio &newbiblioitem
- &modnote &newsubject &newsubtitle
+ &newsubject &newsubtitle
&modbiblio &checkitems
&newitems &modbibitem
- &modsubtitle &modsubject &modaddauthor &moditem &countitems
+ &modsubtitle &modsubject &modaddauthor &moditem
&delitem &deletebiblioitem &delbiblio
&getbiblio
&getbiblioitembybiblionumber
&getbiblioitem &getitemsbybiblioitem
- &skip &getitemtypes
+ &skip
&newcompletebiblioitem
&MARCfind_marc_from_kohafield
&DisplayISBN
);
-#
-#
-# MARC MARC MARC MARC MARC MARC MARC MARC MARC MARC MARC MARC MARC MARC MARC MARC MARC MARC MARC
-#
-#
-# all the following subs takes a MARC::Record as parameter and manage
-# the MARC-DB. They are called by the 1.0/1.2 xxx subs, and by the
-# NEWxxx subs (xxx deals with old-DB parameters, the NEWxxx deals with MARC-DB parameter)
-
=head1 NAME
C4::Biblio - acquisition, catalog management functions
=head1 SYNOPSIS
-move from 1.2 to 1.4 version :
-1.2 and previous version uses a specific API to manage biblios. This API uses old-DB style parameters.
-In the 1.4 version, we want to do 2 differents things :
- - keep populating the old-DB, that has a LOT less datas than MARC
- - populate the MARC-DB
-To populate the DBs we have 2 differents sources :
- - the standard acquisition system (through book sellers), that does'nt use MARC data
- - the MARC acquisition system, that uses MARC data.
-
-Thus, we have 2 differents cases :
-- with the standard acquisition system, we have non MARC data and want to populate old-DB and MARC-DB, knowing it's an incomplete MARC-record
-- with the MARC acquisition system, we have MARC datas, and want to loose nothing in MARC-DB. So, we can't store datas in old-DB, then copy in MARC-DB. we MUST have an API for true MARC data, that populate MARC-DB then old-DB
-
-That's why we need 4 subs :
-all I<subs beginning by MARC> manage only MARC tables. They manage MARC-DB with MARC::Record parameters
-all I<subs beginning by OLD> manage only OLD-DB tables. They manage old-DB with old-DB parameters
-all I<subs beginning by NEW> manage both OLD-DB and MARC tables. They use MARC::Record as parameters. it's the API that MUST be used in MARC acquisition system
-all I<subs beginning by seomething else> are the old-style API. They use old-DB as parameter, then call internally the OLD and MARC subs.
-
-- NEW and old-style API should be used in koha to manage biblio
-- MARCsubs are divided in 2 parts :
-* some of them manage MARC parameters. They are heavily used in koha.
-* some of them manage MARC biblio : they are mostly used by NEW and old-style subs.
-- OLD are used internally only
-
-all subs requires/use $dbh as 1st parameter.
+( lot of changes for Koha 3.0)
-I<NEWxxx related subs>
+Koha 1.2 and previous version used a specific API to manage biblios. This API uses old-DB style parameters.
+They are based on a hash, and store data in biblio/biblioitems/items tables (plus additionalauthors, bibliosubject and bibliosubtitle where applicable)
-all subs requires/use $dbh as 1st parameter.
-those subs are used by the MARC-compliant version of koha : marc import, or marc management.
+In Koha 2.0, we introduced a MARC-DB.
-I<OLDxxx related subs>
+In Koha 3.0 we removed this MARC-DB for search as we wanted to use Zebra as search system.
-all subs requires/use $dbh as 1st parameter.
-those subs are used by the MARC-compliant version of koha : marc import, or marc management.
+So in Koha 3.0, saving a record means :
+ - storing the raw marc record (iso2709) in biblioitems.marc field. It contains both biblio & items informations.
+ - storing the "decoded information" in biblio/biblioitems/items as previously.
+ - using zebra to manage search & indexing on the MARC datas.
+
+ In Koha, there is a systempreference saying "MARC=ON" or "MARC=OFF"
+
+ * MARC=ON : when MARC=ON, koha uses a MARC::Record object (in sub parameters). Saving informations in the DB means :
+ - transform the MARC record into a hash
+ - add the raw marc record into the hash
+ - store them & update zebra
+
+ * MARC=OFF : when MARC=OFF, koha uses a hash object (in sub parameters). Saving informations in the DB means :
+ - transform the hash into a MARC record
+ - add the raw marc record into the hash
+ - store them and update zebra
+
+
+That's why we need 3 types of subs :
-They all are the exact copy of 1.0/1.2 version of the sub without the OLD.
-The OLDxxx is called by the original xxx sub.
-the 1.4 xxx sub also builds MARC::Record an calls the MARCxxx
+=head2 REALxxx subs
-WARNING : there is 1 difference between initialxxx and OLDxxx :
-the db header $dbh is always passed as parameter to avoid over-DB connexion
+all I<subs beginning by REAL> does effective storage of information (with a hash, one field of the hash being the raw marc record). Those subs also update the record in zebra. REAL subs should be only for internal use (called by NEW or "something else" subs
-=head1 DESCRIPTION
+=head2 NEWxxx related subs
=over 4
-=item @tagslib = &MARCgettagslib($dbh,1|0,$itemtype);
-
-last param is 1 for liblibrarian and 0 for libopac
-$itemtype contains the itemtype framework reference. If empty or does not exist, the default one is used
-returns a hash with tag/subfield meaning
-=item ($tagfield,$tagsubfield) = &MARCfind_marc_from_kohafield($dbh,$kohafield);
-
-finds MARC tag and subfield for a given kohafield
-kohafield is "table.field" where table= biblio|biblioitems|items, and field a field of the previous table
-
-=item $biblionumber = &MARCfind_oldbiblionumber_from_MARCbibid($dbh,$MARCbibi);
-
-finds a old-db biblio number for a given MARCbibid number
-
-=item $bibid = &MARCfind_MARCbibid_from_oldbiblionumber($dbh,$oldbiblionumber);
-
-finds a MARC bibid from a old-db biblionumber
+all I<subs beginning by NEW> use MARC::Record as parameters. it's the API that MUST be used in MARC acquisition system. They just create the hash, add it the raw marc record. Then, they call REALxxx sub.
-=item $MARCRecord = &MARCkoha2marcBiblio($dbh,$biblionumber,biblioitemnumber);
+all subs requires/use $dbh as 1st parameter and a MARC::Record object as 2nd parameter. they sometimes requires another parameter.
-MARCkoha2marcBiblio is a wrapper between old-DB and MARC-DB. It returns a MARC::Record builded with old-DB biblio/biblioitem
-
-=item $MARCRecord = &MARCkoha2marcItem($dbh,$biblionumber,itemnumber);
-
-MARCkoha2marcItem is a wrapper between old-DB and MARC-DB. It returns a MARC::Record builded with old-DB item
-
-=item $MARCRecord = &MARCkoha2marcSubtitle($dbh,$biblionumber,$subtitle);
-
-MARCkoha2marcSubtitle is a wrapper between old-DB and MARC-DB. It returns a MARC::Record builded with old-DB subtitle
-
-=item $olddb = &MARCmarc2koha($dbh,$MARCRecord);
-
-builds a hash with old-db datas from a MARC::Record
-
-=item &MARCaddbiblio($dbh,$MARC::Record,$biblionumber);
-
-creates a biblio (in the MARC tables only). $biblionumber is the old-db biblionumber of the biblio
+=back
-=item &MARCaddsubfield($dbh,$bibid,$tagid,$indicator,$tagorder,$subfieldcode,$subfieldorder,$subfieldvalue);
+=head2 something_elsexxx related subs
-adds a subfield in a biblio (in the MARC tables only).
+=over 4
-=item $MARCRecord = &MARCgetbiblio($dbh,$bibid);
+all I<subs beginning by seomething else> are the old-style API. They use a hash as parameter, transform the hash into a -small- marc record, and calls REAL subs.
-Returns a MARC::Record for the biblio $bibid.
+all subs requires/use $dbh as 1st parameter and a hash as 2nd parameter.
-=item &MARCmodbiblio($dbh,$bibid,$record,$frameworkcode,$delete);
+=back
-MARCmodbiblio changes a biblio for a biblio,MARC::Record passed as parameter
-It 1st delete the biblio, then recreates it.
-WARNING : the $delete parameter is not used anymore (too much unsolvable cases).
-=item ($subfieldid,$subfieldvalue) = &MARCmodsubfield($dbh,$subfieldid,$subfieldvalue);
+=head1 API
-MARCmodsubfield changes the value of a given subfield
+=cut
-=item $subfieldid = &MARCfindsubfield($dbh,$bibid,$tag,$subfieldcode,$subfieldorder,$subfieldvalue);
-MARCfindsubfield returns a subfield number given a bibid/tag/subfieldvalue values.
-Returns -1 if more than 1 answer
+=head2 @tagslib = &MARCgettagslib($dbh,1|0,$frameworkcode);
-=item $subfieldid = &MARCfindsubfieldid($dbh,$bibid,$tag,$tagorder,$subfield,$subfieldorder);
+=over 4
-MARCfindsubfieldid find a subfieldid for a bibid/tag/tagorder/subfield/subfieldorder
+2nd param is 1 for liblibrarian and 0 for libopac
+$frameworkcode contains the framework reference. If empty or does not exist, the default one is used
-=item &MARCdelbiblio($dbh,$bibid);
+returns a hash with all values for all fields and subfields for a given MARC framework :
+ $res->{$tag}->{lib} = ($forlibrarian or !$libopac)?$liblibrarian:$libopac;
+ ->{tab} = ""; # XXX
+ ->{mandatory} = $mandatory;
+ ->{repeatable} = $repeatable;
+ ->{$subfield}->{lib} = ($forlibrarian or !$libopac)?$liblibrarian:$libopac;
+ ->{tab} = $tab;
+ ->{mandatory} = $mandatory;
+ ->{repeatable} = $repeatable;
+ ->{authorised_value} = $authorised_value;
+ ->{authtypecode} = $authtypecode;
+ ->{value_builder} = $value_builder;
+ ->{kohafield} = $kohafield;
+ ->{seealso} = $seealso;
+ ->{hidden} = $hidden;
+ ->{isurl} = $isurl;
+ ->{link} = $link;
-MARCdelbiblio delete biblio $bibid
+=back
=cut
return $res;
}
+=head2 ($tagfield,$tagsubfield) = &MARCfind_marc_from_kohafield($dbh,$kohafield);
+
+=over 4
+
+finds MARC tag and subfield for a given kohafield
+kohafield is "table.field" where table= biblio|biblioitems|items, and field a field of the previous table
+
+=back
+
+=cut
+
sub MARCfind_marc_from_kohafield {
my ( $dbh, $kohafield,$frameworkcode ) = @_;
return 0, 0 unless $kohafield;
return ($relations->{$frameworkcode}->{$kohafield}->[0],$relations->{$frameworkcode}->{$kohafield}->[1]);
}
+=head2 $MARCRecord = &MARCgetbiblio($dbh,$biblionumber);
+
+=over 4
+
+Returns a MARC::Record for the biblio $biblionumber.
+
+=cut
sub MARCgetbiblio {
return $record;
}
+=head2 $MARCrecord = &MARCgetitem($dbh,$biblionumber);
+
+=over 4
+
+Returns a MARC::Record with all items of biblio # $biblionumber
+
+=back
+
+=cut
+
sub MARCgetitem {
my ( $dbh, $biblionumber, $itemnumber ) = @_;
return $itemrecord;
}
+=head2 sub find_biblioitemnumber($dbh,$biblionumber);
+
+=over 4
+
+Returns the 1st biblioitemnumber related to $biblionumber. When MARC=ON we should have 1 biblionumber = 1 and only 1 biblioitemnumber
+This sub is useless when MARC=OFF
+
+=back
+
+=cut
sub find_biblioitemnumber {
my ( $dbh, $biblionumber ) = @_;
my $sth = $dbh->prepare("select biblioitemnumber from biblioitems where biblionumber=?");
return $biblioitemnumber;
}
+=head2 $frameworkcode = MARCfind_frameworkcode($dbh,$biblionumber);
+
+=over 4
+
+returns the framework of a given biblio
+
+=back
+
+=cut
+
sub MARCfind_frameworkcode {
my ( $dbh, $biblionumber ) = @_;
my $sth = $dbh->prepare("select frameworkcode from biblio where biblionumber=?");
return $frameworkcode;
}
+=head2 $MARCRecord = &MARCkoha2marcBiblio($dbh,$biblionumber,biblioitemnumber);
+
+=over 4
+
+MARCkoha2marcBiblio is a wrapper between old-DB and MARC-DB. It returns a MARC::Record builded with old-DB biblio/biblioitem :
+all entries of the hash are transformed into their matching MARC field/subfield.
+
+=back
+
+=cut
sub MARCkoha2marcBiblio {
return $record;
}
+=head2 $MARCRecord = &MARCkoha2marcItem($dbh,$biblionumber,itemnumber);
+
+MARCkoha2marcItem is a wrapper between old-DB and MARC-DB. It returns a MARC::Record builded with old-DB items :
+all entries of the hash are transformed into their matching MARC field/subfield.
+
+=over 4
+
+=back
+
+=cut
+
sub MARCkoha2marcItem {
# this function builds partial MARC::Record from the old koha-DB fields
return $record;
}
-sub MARCkoha2marcSubtitle {
+=head2 MARCkoha2marcOnefield
- # this function builds partial MARC::Record from the old koha-DB fields
- my ( $dbh, $bibnum, $subtitle ) = @_;
- my $sth =
- $dbh->prepare(
-"select tagfield,tagsubfield from marc_subfield_structure where frameworkcode=? and kohafield=?"
- );
- my $record = MARC::Record->new();
- &MARCkoha2marcOnefield( $sth, $record, "bibliosubtitle.subtitle",
- $subtitle,'' );
- return $record;
-}
+=over 4
+
+This sub is for internal use only, used by koha2marcBiblio & koha2marcItem
+
+=back
+
+=cut
sub MARCkoha2marcOnefield {
my ( $sth, $record, $kohafieldname, $value,$frameworkcode ) = @_;
return $record;
}
+=head2 $MARCrecord = MARChtml2marc($dbh,$rtags,$rsubfields,$rvalues,%indicators);
+
+=over 4
+
+transforms the parameters (coming from HTML form) into a MARC::Record
+parameters with r are references to arrays.
+
+FIXME : should be improved for 3.0, to avoid having 4 differents arrays
+
+=back
+
+=cut
+
sub MARChtml2marc {
my ($dbh,$rtags,$rsubfields,$rvalues,%indicators) = @_;
my $prevtag = -1;
return $record;
}
+
+=head2 $hash = &MARCmarc2koha($dbh,$MARCRecord);
+
+=over 4
+
+builds a hash with old-db datas from a MARC::Record
+
+=back
+
+=cut
+
sub MARCmarc2koha {
my ($dbh,$record,$frameworkcode) = @_;
my $sth=$dbh->prepare("select tagfield,tagsubfield from marc_subfield_structure where frameworkcode=? and kohafield=?");
return $result;
}
-#
-#
-# NEW NEW NEW NEW NEW NEW NEW NEW NEW NEW NEW NEW NEW NEW NEW NEW NEW NEW
-#
-#
-# all the following subs are useful to manage MARC-DB with complete MARC records.
-# it's used with marcimport, and marc management tools
-#
+=head2 ($biblionumber,$biblioitemnumber) = NEWnewbibilio($dbh,$MARCRecord,$frameworkcode);
-=item ($bibid,$oldbibnum,$oldbibitemnum) = NEWnewbibilio($dbh,$MARCRecord,$frameworkcode);
+=over 4
creates a biblio from a MARC::Record.
-=item NEWnewitem($dbh, $record,$bibid);
-
-creates an item from a MARC::Record
+=back
=cut
my $biblioitemnumber;
my $olddata = MARCmarc2koha( $dbh, $record,$frameworkcode );
$olddata->{frameworkcode} = $frameworkcode;
- $biblionumber = OLDnewbiblio( $dbh, $olddata );
+ $biblionumber = REALnewbiblio( $dbh, $olddata );
$olddata->{biblionumber} = $biblionumber;
# add biblionumber into the MARC record (it's the ID for zebra)
my ( $tagfield, $tagsubfield ) =
$olddata->{marc} = $record->as_usmarc();
$olddata->{marcxml} = $record->as_xml();
# and create biblioitem, that's all folks !
- $biblioitemnumber = OLDnewbiblioitem( $dbh, $olddata );
+ $biblioitemnumber = REALnewbiblioitem( $dbh, $olddata );
# search subtiles, addiauthors and subjects
( $tagfield, $tagsubfield ) =
foreach my $addiauthfield (@addiauthfields) {
my @addiauthsubfields = $addiauthfield->subfield($tagsubfield);
foreach my $subfieldcount ( 0 .. $#addiauthsubfields ) {
- OLDmodaddauthor( $dbh, $biblionumber,
+ REALmodaddauthor( $dbh, $biblionumber,
$addiauthsubfields[$subfieldcount] );
}
}
foreach my $subtitlefield (@subtitlefields) {
my @subtitlesubfields = $subtitlefield->subfield($tagsubfield);
foreach my $subfieldcount ( 0 .. $#subtitlesubfields ) {
- OLDnewsubtitle( $dbh, $biblionumber,
+ REALnewsubtitle( $dbh, $biblionumber,
$subtitlesubfields[$subfieldcount] );
}
}
push @subjects, $subjsubfield[$subfieldcount];
}
}
- OLDmodsubject( $dbh, $biblionumber, 1, @subjects );
+ REALmodsubject( $dbh, $biblionumber, 1, @subjects );
return ( $biblionumber, $biblioitemnumber );
}
+=head2 NEWmodbilbioframework($dbh,$biblionumber,$frameworkcode);
+
+=over 4
+
+modify the framework of a biblio
+
+=back
+
+=cut
+
sub NEWmodbiblioframework {
my ($dbh,$biblionumber,$frameworkcode) =@_;
my $sth = $dbh->prepare("Update biblio SET frameworkcode=? WHERE biblionumber=?");
return 1;
}
+=head2 NEWmodbiblio($dbh,$MARCrecord,$biblionumber,$frameworkcode);
+
+=over 4
+
+modify a biblio (MARC=ON)
+
+=back
+
+=cut
+
sub NEWmodbiblio {
my ($dbh,$record,$biblionumber,$frameworkcode) =@_;
$frameworkcode="" unless $frameworkcode;
$oldbiblio->{marc} = $record->as_usmarc();
$oldbiblio->{marcxml} = $record->as_xml();
- OLDmodbiblio($dbh,$oldbiblio);
- OLDmodbibitem($dbh,$oldbiblio);
+ REALmodbiblio($dbh,$oldbiblio);
+ REALmodbiblitem($dbh,$oldbiblio);
# now, modify addi authors, subject, addititles.
my ($tagfield,$tagsubfield) = MARCfind_marc_from_kohafield($dbh,"additionalauthors.author",$frameworkcode);
my @addiauthfields = $record->field($tagfield);
foreach my $addiauthfield (@addiauthfields) {
my @addiauthsubfields = $addiauthfield->subfield($tagsubfield);
foreach my $subfieldcount (0..$#addiauthsubfields) {
- OLDmodaddauthor($dbh,$biblionumber,$addiauthsubfields[$subfieldcount]);
+ REALmodaddauthor($dbh,$biblionumber,$addiauthsubfields[$subfieldcount]);
}
}
($tagfield,$tagsubfield) = MARCfind_marc_from_kohafield($dbh,"bibliosubtitle.subtitle",$frameworkcode);
my @subtitlefields = $record->field($tagfield);
foreach my $subtitlefield (@subtitlefields) {
my @subtitlesubfields = $subtitlefield->subfield($tagsubfield);
- # delete & create subtitle again because OLDmodsubtitle can't handle new subtitles
+ # delete & create subtitle again because REALmodsubtitle can't handle new subtitles
# between 2 modifs
$dbh->do("delete from bibliosubtitle where biblionumber=$biblionumber");
foreach my $subfieldcount (0..$#subtitlesubfields) {
foreach my $subtit(split /\||#/,$subtitlesubfields[$subfieldcount]) {
- OLDnewsubtitle($dbh,$biblionumber,$subtit);
+ REALnewsubtitle($dbh,$biblionumber,$subtit);
}
}
}
push @subjects,$subjsubfield[$subfieldcount];
}
}
- OLDmodsubject($dbh,$biblionumber,1,@subjects);
+ REALmodsubject($dbh,$biblionumber,1,@subjects);
return 1;
}
+=head2 NEWmodbilbioframework($dbh,$biblionumber,$frameworkcode);
+
+=over 4
+
+delete a biblio
+
+=back
+
+=cut
+
sub NEWdelbiblio {
my ( $dbh, $bibid ) = @_;
my $biblio = &MARCfind_oldbiblionumber_from_MARCbibid( $dbh, $bibid );
- &OLDdelbiblio( $dbh, $biblio );
+ &REALdelbiblio( $dbh, $biblio );
my $sth =
$dbh->prepare(
"select biblioitemnumber from biblioitems where biblionumber=?");
$sth->execute($biblio);
while ( my ($biblioitemnumber) = $sth->fetchrow ) {
- OLDdeletebiblioitem( $dbh, $biblioitemnumber );
+ REALdelbiblioitem( $dbh, $biblioitemnumber );
}
&MARCdelbiblio( $dbh, $bibid, 0 );
}
+=head2 $itemnumber = NEWnewitem($dbh, $record, $biblionumber, $biblioitemnumber);
+
+=over 4
+
+creates an item from a MARC::Record
+
+=back
+
+=cut
+
sub NEWnewitem {
my ( $dbh, $record, $biblionumber, $biblioitemnumber ) = @_;
$item->{'biblionumber'} = $biblionumber;
$item->{'biblioitemnumber'}=$biblioitemnumber;
$item->{marc} = $record->as_usmarc();
- my ( $itemnumber, $error ) = &OLDnewitems( $dbh, $item, $item->{barcode} );
+ my ( $itemnumber, $error ) = &REALnewitems( $dbh, $item, $item->{barcode} );
return $itemnumber;
}
+
+=head2 $itemnumber = NEWmoditem($dbh, $record, $biblionumber, $biblioitemnumber,$itemnumber);
+
+=over 4
+
+Modify an item
+
+=back
+
+=cut
+
sub NEWmoditem {
- my ( $dbh, $record, $biblionumber, $biblioitemnumber, $itemnumber, $delete ) = @_;
+ my ( $dbh, $record, $biblionumber, $biblioitemnumber, $itemnumber) = @_;
-# &MARCmoditem( $dbh, $record, $bibid, $itemnumber, $delete );
my $frameworkcode=MARCfind_frameworkcode($dbh,$biblionumber);
my $olditem = MARCmarc2koha( $dbh, $record,$frameworkcode );
# add MARC record
$olditem->{biblionumber} = $biblionumber;
$olditem->{biblioitemnumber} = $biblioitemnumber;
# and modify item
- OLDmoditem( $dbh, $olditem );
+ REALmoditem( $dbh, $olditem );
}
-sub NEWdelitem {
- my ( $dbh, $bibid, $itemnumber ) = @_;
- my $biblio = &MARCfind_oldbiblionumber_from_MARCbibid( $dbh, $bibid );
- &OLDdelitem( $dbh, $itemnumber );
- &MARCdelitem( $dbh, $bibid, $itemnumber );
-}
-
-#
-#
-# OLD OLD OLD OLD OLD OLD OLD OLD OLD OLD OLD OLD OLD OLD OLD OLD OLD
-#
-#
-
-=item $biblionumber = OLDnewbiblio($dbh,$biblio);
-
-adds a record in biblio table. Datas are in the hash $biblio.
-
-=item $biblionumber = OLDmodbiblio($dbh,$biblio);
-
-modify a record in biblio table. Datas are in the hash $biblio.
-
-=item OLDmodsubtitle($dbh,$bibnum,$subtitle);
-
-modify subtitles in bibliosubtitle table.
-
-=item OLDmodaddauthor($dbh,$bibnum,$author);
-
-adds or modify additional authors
-NOTE : Strange sub : seems to delete MANY and add only ONE author... maybe buggy ?
-
-=item $errors = OLDmodsubject($dbh,$bibnum, $force, @subject);
-modify/adds subjects
-
-=item OLDmodbibitem($dbh, $biblioitem);
-
-modify a biblioitem
-
-=item OLDmodnote($dbh,$bibitemnum,$note
-
-modify a note for a biblioitem
-
-=item OLDnewbiblioitem($dbh,$biblioitem);
-
-adds a biblioitem ($biblioitem is a hash with the values)
+=head2 $itemnumber = NEWdelitem($dbh, $biblionumber, $biblioitemnumber, $itemnumber);
-=item OLDnewsubject($dbh,$bibnum);
-
-adds a subject
-
-=item OLDnewsubtitle($dbh,$bibnum,$subtitle);
-
-create a new subtitle
-
-=item ($itemnumber,$errors)= OLDnewitems($dbh,$item,$barcode);
+=over 4
-create a item. $item is a hash and $barcode the barcode.
+delete an item
-=item OLDmoditem($dbh,$item);
+=back
-modify item
+=cut
-=item OLDdelitem($dbh,$itemnum);
+sub NEWdelitem {
+ my ( $dbh, $bibid, $itemnumber ) = @_;
+ my $biblio = &MARCfind_oldbiblionumber_from_MARCbibid( $dbh, $bibid );
+ &REALdelitem( $dbh, $itemnumber );
+ &MARCdelitem( $dbh, $bibid, $itemnumber );
+}
-delete item
-=item OLDdeletebiblioitem($dbh,$biblioitemnumber);
+=head2 $biblionumber = REALnewbiblio($dbh,$biblio);
-deletes a biblioitem
-NOTE : not standard sub name. Should be OLDdelbiblioitem()
+=over 4
-=item OLDdelbiblio($dbh,$biblio);
+adds a record in biblio table. Datas are in the hash $biblio.
-delete a biblio
+=back
=cut
-sub OLDnewbiblio {
+sub REALnewbiblio {
my ( $dbh, $biblio ) = @_;
$dbh->do('lock tables biblio WRITE');
return ($bibnum);
}
-sub OLDmodbiblio {
+=head2 $biblionumber = REALmodbiblio($dbh,$biblio);
+
+=over 4
+
+modify a record in biblio table. Datas are in the hash $biblio.
+
+=back
+
+=cut
+
+sub REALmodbiblio {
my ( $dbh, $biblio ) = @_;
my $sth = $dbh->prepare("Update biblio set title=?, author=?, abstract=?, copyrightdate=?,
seriestitle=?, serial=?, unititle=?, notes=?, frameworkcode=?
return ( $biblio->{'biblionumber'} );
} # sub modbiblio
-sub OLDmodsubtitle {
+=head2 REALmodsubtitle($dbh,$bibnum,$subtitle);
+
+=over 4
+
+modify subtitles in bibliosubtitle table.
+
+=back
+
+=cut
+
+sub REALmodsubtitle {
my ( $dbh, $bibnum, $subtitle ) = @_;
my $sth =
$dbh->prepare(
$sth->finish;
} # sub modsubtitle
-sub OLDmodaddauthor {
+=head2 REALmodaddauthor($dbh,$bibnum,$author);
+
+=over 4
+
+adds or modify additional authors
+NOTE : Strange sub : seems to delete MANY and add only ONE author... maybe buggy ?
+
+=back
+
+=cut
+
+sub REALmodaddauthor {
my ( $dbh, $bibnum, @authors ) = @_;
# my $dbh = C4Connect;
}
} # sub modaddauthor
-sub OLDmodsubject {
+=head2 $errors = REALmodsubject($dbh,$bibnum, $force, @subject);
+
+=over 4
+
+modify/adds subjects
+
+=back
+
+=cut
+sub REALmodsubject {
my ( $dbh, $bibnum, $force, @subject ) = @_;
# my $dbh = C4Connect;
return ($error);
} # sub modsubject
-sub OLDmodbibitem {
+=head2 REALmodbiblitem($dbh, $biblioitem);
+
+=over 4
+
+modify a biblioitem
+
+=back
+
+=cut
+sub REALmodbiblitem {
my ( $dbh, $biblioitem ) = @_;
my $query;
# warn "MOD : $biblioitem->{biblioitemnumber} = ".$biblioitem->{marc};
} # sub modbibitem
-sub OLDmodnote {
- my ( $dbh, $bibitemnum, $note ) = @_;
+=head2 REALnewbiblioitem($dbh,$biblioitem);
- # my $dbh=C4Connect;
- my $query = "update biblioitems set notes='$note' where
- biblioitemnumber='$bibitemnum'";
- my $sth = $dbh->prepare($query);
- $sth->execute;
- $sth->finish;
+=over 4
- # $dbh->disconnect;
-}
+adds a biblioitem ($biblioitem is a hash with the values)
+
+=back
+
+=cut
-sub OLDnewbiblioitem {
+sub REALnewbiblioitem {
my ( $dbh, $biblioitem ) = @_;
$dbh->do("lock tables biblioitems WRITE, biblio WRITE");
return ($biblioitemnumber);
}
-sub OLDnewsubject {
- my ( $dbh, $bibnum ) = @_;
- my $sth =
- $dbh->prepare("insert into bibliosubject (biblionumber) values (?)");
- $sth->execute($bibnum);
- $sth->finish;
-}
+=head2 REALnewsubtitle($dbh,$bibnum,$subtitle);
+
+=over 4
+
+create a new subtitle
+
+=back
-sub OLDnewsubtitle {
+=cut
+sub REALnewsubtitle {
my ( $dbh, $bibnum, $subtitle ) = @_;
my $sth =
$dbh->prepare(
$sth->finish;
}
-sub OLDnewitems {
+=head2 ($itemnumber,$errors)= REALnewitems($dbh,$item,$barcode);
+
+=over 4
+
+create a item. $item is a hash and $barcode the barcode.
+
+=back
+
+=cut
+
+sub REALnewitems {
my ( $dbh, $item, $barcode ) = @_;
# warn "OLDNEWITEMS";
return ( $itemnumber, $error );
}
-sub OLDmoditem {
+=head2 REALmoditem($dbh,$item);
+
+=over 4
+
+modify item
+
+=back
+
+=cut
+
+sub REALmoditem {
my ( $dbh, $item ) = @_;
my $error;
$dbh->do('lock tables items WRITE, biblio WRITE,biblioitems WRITE');
$error .= $sth->errstr;
}
my ($rawmarc,$frameworkcode) = $sth->fetchrow;
- warn "ERROR IN OLDmoditem, MARC record not found" unless $rawmarc;
+ warn "ERROR IN REALmoditem, MARC record not found" unless $rawmarc;
my $record = MARC::File::USMARC::decode($rawmarc);
# ok, we have the marc record, find the previous item record for this itemnumber and delete it
my ($itemnumberfield,$itemnumbersubfield) = MARCfind_marc_from_kohafield($dbh,'items.itemnumber',$frameworkcode);
# $dbh->disconnect;
}
-sub OLDdelitem {
+=head2 REALdelitem($dbh,$itemnum);
+
+=over 4
+
+delete item
+
+=back
+
+=cut
+
+sub REALdelitem {
my ( $dbh, $itemnum ) = @_;
# my $dbh=C4Connect;
# $dbh->disconnect;
}
-sub OLDdeletebiblioitem {
+=head2 REALdelbiblioitem($dbh,$biblioitemnumber);
+
+=over 4
+
+deletes a biblioitem
+NOTE : not standard sub name. Should be REALdelbiblioitem()
+
+=back
+
+=cut
+
+sub REALdelbiblioitem {
my ( $dbh, $biblioitemnumber ) = @_;
# my $dbh = C4Connect;
# $dbh->disconnect;
} # sub deletebiblioitem
-sub OLDdelbiblio {
+=head2 REALdelbiblio($dbh,$biblio);
+
+=over 4
+
+delete a biblio
+
+=back
+
+=cut
+
+sub REALdelbiblio {
my ( $dbh, $biblio ) = @_;
my $sth = $dbh->prepare("select * from biblio where biblionumber=?");
$sth->execute($biblio);
$sth->finish;
}
-#
-#
-# old functions
-#
-#
+=head2 $number = itemcount($biblio);
+
+=over 4
+
+returns the number of items attached to a biblio
+
+=back
+
+=cut
sub itemcount {
my ($biblio) = @_;
return ( $data->{'count(*)'} );
}
+=head2 $biblionumber = newbiblio($biblio);
+
+=over 4
+
+create a biblio. The parameter is a hash
+
+=back
+
+=cut
+
sub newbiblio {
my ($biblio) = @_;
my $dbh = C4::Context->dbh;
- my $bibnum = OLDnewbiblio( $dbh, $biblio );
+ my $bibnum = REALnewbiblio( $dbh, $biblio );
# finds new (MARC bibid
# my $bibid = &MARCfind_MARCbibid_from_oldbiblionumber($dbh,$bibnum);
my $record = &MARCkoha2marcBiblio( $dbh, $bibnum );
return ($bibnum);
}
-=item modbiblio
+=head2 $biblionumber = &modbiblio($biblio);
- $biblionumber = &modbiblio($biblio);
+=over 4
Update a biblio record.
C<&modbiblio> returns C<$biblio-E<gt>{biblionumber}> whether it was
successful or not.
+=back
+
=cut
sub modbiblio {
my ($biblio) = @_;
my $dbh = C4::Context->dbh;
- my $biblionumber=OLDmodbiblio($dbh,$biblio);
+ my $biblionumber=REALmodbiblio($dbh,$biblio);
my $record = MARCkoha2marcBiblio($dbh,$biblionumber,$biblionumber);
# finds new (MARC bibid
my $bibid = &MARCfind_MARCbibid_from_oldbiblionumber($dbh,$biblionumber);
return($biblionumber);
} # sub modbiblio
-=item modsubtitle
+=head2 &modsubtitle($biblionumber, $subtitle);
- &modsubtitle($biblionumber, $subtitle);
+=over 4
Sets the subtitle of a book.
C<$subtitle> is the new subtitle.
+=back
+
=cut
sub modsubtitle {
my ( $bibnum, $subtitle ) = @_;
my $dbh = C4::Context->dbh;
- &OLDmodsubtitle( $dbh, $bibnum, $subtitle );
+ &REALmodsubtitle( $dbh, $bibnum, $subtitle );
} # sub modsubtitle
-=item modaddauthor
+=head2 &modaddauthor($biblionumber, $author);
- &modaddauthor($biblionumber, $author);
+=over 4
Replaces all additional authors for the book with biblio number
C<$biblionumber> with C<$author>. If C<$author> is the empty string,
C<&modaddauthor> deletes all additional authors.
+=back
+
=cut
sub modaddauthor {
my ( $bibnum, @authors ) = @_;
my $dbh = C4::Context->dbh;
- &OLDmodaddauthor( $dbh, $bibnum, @authors );
+ &REALmodaddauthor( $dbh, $bibnum, @authors );
} # sub modaddauthor
-=item modsubject
+=head2 $error = &modsubject($biblionumber, $force, @subjects);
- $error = &modsubject($biblionumber, $force, @subjects);
+=over 4
$force - a subject to force
-
$error - Error message, or undef if successful.
+=back
+
=cut
sub modsubject {
my ( $bibnum, $force, @subject ) = @_;
my $dbh = C4::Context->dbh;
- my $error = &OLDmodsubject( $dbh, $bibnum, $force, @subject );
+ my $error = &REALmodsubject( $dbh, $bibnum, $force, @subject );
if ($error eq ''){
# When MARC is off, ensures that the MARC biblio table gets updated with new
# subjects, of course, it deletes the biblio in marc, and then recreates.
return ($error);
} # sub modsubject
+=head2 modbibitem($biblioitem);
+
+=over 4
+
+modify a biblioitem. The parameter is a hash
+
+=back
+
+=cut
+
sub modbibitem {
my ($biblioitem) = @_;
my $dbh = C4::Context->dbh;
- &OLDmodbibitem( $dbh, $biblioitem );
+ &REALmodbiblitem( $dbh, $biblioitem );
} # sub modbibitem
-sub modnote {
- my ( $bibitemnum, $note ) = @_;
- my $dbh = C4::Context->dbh;
- &OLDmodnote( $dbh, $bibitemnum, $note );
-}
+=head2 $biblioitemnumber = newbiblioitem($biblioitem)
+
+=over 4
+
+create a biblioitem, the parameter is a hash
+
+=back
+
+=cut
sub newbiblioitem {
my ($biblioitem) = @_;
my $dbh = C4::Context->dbh;
- my $bibitemnum = &OLDnewbiblioitem( $dbh, $biblioitem );
+ my $bibitemnum = &REALnewbiblioitem( $dbh, $biblioitem );
my $MARCbiblio =
MARCkoha2marcBiblio( $dbh, 0, $bibitemnum )
return ($bibitemnum);
}
-sub newsubject {
- my ($bibnum) = @_;
- my $dbh = C4::Context->dbh;
- &OLDnewsubject( $dbh, $bibnum );
-}
+=head2 newsubtitle($biblionumber,$subtitle);
+
+=over 4
+
+insert a subtitle for $biblionumber biblio
+
+=back
+
+=cut
+
sub newsubtitle {
my ( $bibnum, $subtitle ) = @_;
my $dbh = C4::Context->dbh;
- &OLDnewsubtitle( $dbh, $bibnum, $subtitle );
+ &REALnewsubtitle( $dbh, $bibnum, $subtitle );
}
+=head2 $errors = newitems($item, @barcodes);
+
+=over 4
+
+insert items ($item is a hash)
+
+=back
+
+=cut
+
+
sub newitems {
my ( $item, @barcodes ) = @_;
my $dbh = C4::Context->dbh;
my $itemnumber;
my $error;
foreach my $barcode (@barcodes) {
- ( $itemnumber, $error ) = &OLDnewitems( $dbh, $item, uc($barcode) );
+ ( $itemnumber, $error ) = &REALnewitems( $dbh, $item, uc($barcode) );
$errors .= $error;
my $MARCitem =
&MARCkoha2marcItem( $dbh, $item->{biblionumber}, $itemnumber );
return ($errors);
}
+=head2 moditem($item);
+
+=over 4
+
+modify an item ($item is a hash with all item informations)
+
+=back
+
+=cut
+
+
sub moditem {
my ($item) = @_;
my $dbh = C4::Context->dbh;
- &OLDmoditem( $dbh, $item );
+ &REALmoditem( $dbh, $item );
my $MARCitem =
&MARCkoha2marcItem( $dbh, $item->{'biblionumber'}, $item->{'itemnum'} );
my $bibid =
&MARCmoditem( $dbh, $MARCitem, $bibid, $item->{itemnum}, 0 );
}
+=head2 $error = checkitems($count,@barcodes);
+
+=over 4
+
+check for each @barcode entry that the barcode is not a duplicate
+
+=back
+
+=cut
+
sub checkitems {
my ( $count, @barcodes ) = @_;
my $dbh = C4::Context->dbh;
return ($error);
}
-sub countitems {
- my ($bibitemnum) = @_;
- my $dbh = C4::Context->dbh;
- my $query = "";
- my $sth =
- $dbh->prepare("Select count(*) from items where biblioitemnumber=?");
- $sth->execute($bibitemnum);
- my $data = $sth->fetchrow_hashref;
- $sth->finish;
- return ( $data->{'count(*)'} );
-}
+=head2 $delitem($itemnum);
+
+=over 4
+
+delete item $itemnum being the item number to delete
+
+=back
+
+=cut
sub delitem {
my ($itemnum) = @_;
my $dbh = C4::Context->dbh;
- &OLDdelitem( $dbh, $itemnum );
+ &REALdelitem( $dbh, $itemnum );
}
+=head2 deletebiblioitem($biblioitemnumber);
+
+=over 4
+
+delete the biblioitem $biblioitemnumber
+
+=back
+
+=cut
+
sub deletebiblioitem {
my ($biblioitemnumber) = @_;
my $dbh = C4::Context->dbh;
- &OLDdeletebiblioitem( $dbh, $biblioitemnumber );
+ &REALdelbiblioitem( $dbh, $biblioitemnumber );
} # sub deletebiblioitem
+=head2 delbiblio($biblionumber)
+
+=over 4
+
+delete biblio $biblionumber
+
+=back
+
+=cut
+
sub delbiblio {
my ($biblio) = @_;
my $dbh = C4::Context->dbh;
- &OLDdelbiblio( $dbh, $biblio );
+ &REALdelbiblio( $dbh, $biblio );
my $bibid = &MARCfind_MARCbibid_from_oldbiblionumber( $dbh, $biblio );
&MARCdelbiblio( $dbh, $bibid, 0 );
}
+=head2 ($count,@results) = getbiblio($biblionumber);
+
+=over 4
+
+return an array with hash of biblios.
+
+FIXME : biblionumber being the primary key, this sub will always return only 1 result, API should be modified...
+
+=back
+
+=cut
+
sub getbiblio {
my ($biblionumber) = @_;
my $dbh = C4::Context->dbh;
return ( $count, @results );
} # sub getbiblio
+=head2 ($count,@results) = getbiblioitem($biblioitemnumber);
+
+=over 4
+
+return an array with hash of biblioitemss.
+
+FIXME : biblioitemnumber being unique, this sub will always return only 1 result, API should be modified...
+
+=back
+
+=cut
+
sub getbiblioitem {
my ($biblioitemnum) = @_;
my $dbh = C4::Context->dbh;
return ( $count, @results );
} # sub getbiblioitem
+=head2 ($count,@results) = getbiblioitembybiblionumber($biblionumber);
+
+=over 4
+
+return an array with hash of biblioitems for the given biblionumber.
+
+=back
+
+=cut
+
sub getbiblioitembybiblionumber {
my ($biblionumber) = @_;
my $dbh = C4::Context->dbh;
return ( $count, @results );
} # sub
-sub getitemtypes {
- my $dbh = C4::Context->dbh;
- my $query = "select * from itemtypes order by description";
- my $sth = $dbh->prepare($query);
+=head2 ($count,@results) = getitemsbybiblioitem($biblionumber);
- # || die "Cannot prepare $query" . $dbh->errstr;
- my $count = 0;
- my @results;
+=over 4
- $sth->execute;
+returns an array with hash of items
- # || die "Cannot execute $query\n" . $sth->errstr;
- while ( my $data = $sth->fetchrow_hashref ) {
- $results[$count] = $data;
- $count++;
- } # while
+=back
- $sth->finish;
- return ( $count, @results );
-} # sub getitemtypes
+=cut
sub getitemsbybiblioitem {
my ($biblioitemnum) = @_;
return ( $count, @results );
} # sub getitemsbybiblioitem
-sub logchange {
-
- # Subroutine to log changes to databases
-# Eventually, this subroutine will be used to create a log of all changes made,
- # with the possibility of "undo"ing some changes
- my $database = shift;
- if ( $database eq 'kohadb' ) {
- my $type = shift;
- my $section = shift;
- my $item = shift;
- my $original = shift;
- my $new = shift;
-
- # print STDERR "KOHA: $type $section $item $original $new\n";
- }
- elsif ( $database eq 'marc' ) {
- my $type = shift;
- my $Record_ID = shift;
- my $tag = shift;
- my $mark = shift;
- my $subfield_ID = shift;
- my $original = shift;
- my $new = shift;
-
-# print STDERR "MARC: $type $Record_ID $tag $mark $subfield_ID $original $new\n";
- }
-}
-
-#------------------------------------------------
-
-#---------------------------------------
-# Find a biblio entry, or create a new one if it doesn't exist.
-# If a "subtitle" entry is in hash, add it to subtitle table
-sub getoraddbiblio {
-
- # input params
- my (
- $dbh, # db handle
- # FIXME - Unused argument
- $biblio, # hash ref to fields
- ) = @_;
-
- # return
- my $biblionumber;
-
- my $debug = 0;
- my $sth;
- my $error;
-
- #-----
- $dbh = C4::Context->dbh;
-
- print "<PRE>Looking for biblio </PRE>\n" if $debug;
- $sth = $dbh->prepare( "select biblionumber
- from biblio
- where title=? and author=?
- and copyrightdate=? and seriestitle=?"
- );
- $sth->execute(
- $biblio->{title}, $biblio->{author},
- $biblio->{copyright}, $biblio->{seriestitle}
- );
- if ( $sth->rows ) {
- ($biblionumber) = $sth->fetchrow;
- print "<PRE>Biblio exists with number $biblionumber</PRE>\n" if $debug;
- }
- else {
-
- # Doesn't exist. Add new one.
- print "<PRE>Adding biblio</PRE>\n" if $debug;
- ( $biblionumber, $error ) = &newbiblio($biblio);
- if ($biblionumber) {
- print "<PRE>Added with biblio number=$biblionumber</PRE>\n"
- if $debug;
- if ( $biblio->{subtitle} ) {
- &newsubtitle( $biblionumber, $biblio->{subtitle} );
- } # if subtitle
- }
- else {
- print "<PRE>Couldn't add biblio: $error</PRE>\n" if $debug;
- } # if added
- }
-
- return $biblionumber, $error;
-
-} # sub getoraddbiblio
-
sub char_decode {
# converts ISO 5426 coded string to ISO 8859-1
# $Id$
# $Log$
+# Revision 1.127 2005/08/11 14:37:32 tipaul
+# * POD documenting
+# * removing useless subs
+# * removing some subs that are also elsewhere
+# * renaming all OLDxxx subs to REALxxx subs (should not change anything, as OLDxxx, as well as REAL, are supposed to be for Biblio.pm internal use only)
+#
# Revision 1.126 2005/08/11 09:13:28 tipaul
# just removing useless subs (a lot !!!) for code cleaning
#