-package C4::Biblio;
-
+package C4::Biblio;
+# New XML API added by tgarip@neu.edu.tr 25/08/06
# Copyright 2000-2002 Katipo Communications
#
# This file is part of Koha.
# 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 C4::Context;
-use C4::Database;
-use MARC::Record;
-use MARC::File::USMARC;
-use MARC::File::XML;
+use XML::Simple;
+use Encode;
+use utf8;
use vars qw($VERSION @ISA @EXPORT);
# set the version for version checking
-$VERSION = 0.01;
+$VERSION = 2.01;
@ISA = qw(Exporter);
-#
-# don't forget MARCxxx subs are exported only for testing purposes. Should not be used
-# as the old-style API and the NEW one are the only public functions.
+# &itemcount removed, now resides in Search.pm
#
@EXPORT = qw(
- &updateBiblio &updateBiblioItem &updateItem
- &itemcount &newbiblio &newbiblioitem
- &modnote &newsubject &newsubtitle
- &modbiblio &checkitems
- &newitems &modbibitem
- &modsubtitle &modsubject &modaddauthor &moditem &countitems
- &delitem &deletebiblioitem &delbiblio
- &getbiblio
- &getbiblioitembybiblionumber
- &getbiblioitem &getitemsbybiblioitem
- &skip &getitemtypes
- &newcompletebiblioitem
-
- &MARCfind_oldbiblionumber_from_MARCbibid
- &MARCfind_MARCbibid_from_oldbiblionumber
- &MARCfind_marc_from_kohafield
- &MARCfindsubfield
- &MARCfind_frameworkcode
- &find_biblioitemnumber
- &MARCgettagslib
-
- &NEWnewbiblio &NEWnewitem
- &NEWmodbiblio &NEWmoditem
- &NEWdelbiblio &NEWdelitem
- &NEWmodbiblioframework
-
- &MARCaddbiblio &MARCadditem
- &MARCmodsubfield &MARCaddsubfield
- &MARCmodbiblio &MARCmoditem
- &MARCkoha2marcBiblio &MARCmarc2koha
- &MARCkoha2marcItem &MARChtml2marc
- &MARCgetbiblio &MARCgetitem
- &MARCaddword &MARCdelword
- &MARCdelsubfield
- &char_decode
-
- &FindDuplicate
- &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.
+&getitemtypes
+&getkohafields
+&getshelves
+
+&NEWnewbiblio
+&NEWnewitem
+&NEWmodbiblio
+&NEWmoditem
+&NEWdelbiblio
+&NEWdelitem
+&NEWmodbiblioframework
+
+
+&MARCfind_marc_from_kohafield
+&MARCfind_frameworkcode
+&MARCfind_itemtype
+&MARCgettagslib
+&MARCitemsgettagslib
+
+&MARCfind_attr_from_kohafield
+&MARChtml2xml
+
+
+&XMLgetbiblio
+&XMLgetbibliohash
+&XMLgetitem
+&XMLgetitemhash
+&XMLgetallitems
+&XML_xml2hash
+&XML_xml2hash_onerecord
+&XML_hash2xml
+&XMLmarc2koha
+&XMLmarc2koha_onerecord
+&XML_readline
+&XML_readline_onerecord
+&XML_readline_asarray
+&XML_writeline
+&XML_writeline_id
+&XMLmoditemonefield
+&XMLkoha2marc
+&XML_separate
+&XML_record_header
+&ZEBRAdelbiblio
+&ZEBRAgetrecord
+&ZEBRAop
+&ZEBRAopserver
+&ZEBRA_readyXML
+&ZEBRA_readyXML_noheader
+&ZEBRAopcommit
+&newbiblio
+&modbiblio
+&DisplayISBN
-- 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.
-
-I<NEWxxx related subs>
-
-all subs requires/use $dbh as 1st parameter.
-those subs are used by the MARC-compliant version of koha : marc import, or marc management.
-
-I<OLDxxx related subs>
-
-all subs requires/use $dbh as 1st parameter.
-those subs are used by the MARC-compliant version of koha : marc import, or marc management.
-
-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
-
-WARNING : there is 1 difference between initialxxx and OLDxxx :
-the db header $dbh is always passed as parameter to avoid over-DB connexion
-
-=head1 DESCRIPTION
-
-=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);
+#################### XML XML XML XML ###################
+### XML Read- Write functions
+sub XML_readline_onerecord{
+my ($xml,$kohafield,$recordtype,$tag,$subf)=@_;
+#$xml represents one record of MARCXML as perlhashed
+### $recordtype is needed for mapping the correct field
+ ($tag,$subf)=MARCfind_marc_from_kohafield($kohafield,$recordtype) if $kohafield;
+
+if ($tag){
+my $biblio=$xml->{'datafield'};
+my $controlfields=$xml->{'controlfield'};
+my $leader=$xml->{'leader'};
+ if ($tag>9){
+ foreach my $data (@$biblio){
+ if ($data->{'tag'} eq $tag){
+ foreach my $subfield ( $data->{'subfield'}){
+ foreach my $code ( @$subfield){
+ if ($code->{'code'} eq $subf){
+ return $code->{'content'};
+ }
+ }
+ }
+ }
+ }
+ }else{
+ if ($tag eq "000" || $tag eq "LDR"){
+ return $leader->[0] if $leader->[0];
+ }else{
+ foreach my $control (@$controlfields){
+ if ($control->{'tag'} eq $tag){
+ return $control->{'content'} if $control->{'content'};
+ }
+ }
+ }
+ }##tag
+}## if tag is mapped
+return "";
+}
+sub XML_readline_asarray{
+my ($xml,$kohafield,$recordtype,$tag,$subf)=@_;
+#$xml represents one record of MARCXML as perlhashed
+## returns an array of read fields--useful for readind repeated fields
+### $recordtype is needed for mapping the correct field if supplied
+### If only $tag is give reads the whole tag
+my @value;
+ ($tag,$subf)=MARCfind_marc_from_kohafield($kohafield,$recordtype) if $kohafield;
+if ($tag){
+my $biblio=$xml->{'datafield'};
+my $controlfields=$xml->{'controlfield'};
+my $leader=$xml->{'leader'};
+ if ($tag>9){
+ foreach my $data (@$biblio){
+ if ($data->{'tag'} eq $tag){
+ foreach my $subfield ( $data->{'subfield'}){
+ foreach my $code ( @$subfield){
+ if ($code->{'code'} eq $subf || !$subf){
+ push @value, $code->{'content'};
+ }
+ }
+ }
+ }
+ }
+ }else{
+ if ($tag eq "000" || $tag eq "LDR"){
+ push @value, $leader->[0] if $leader->[0];
+ }else{
+ foreach my $control (@$controlfields){
+ if ($control->{'tag'} eq $tag){
+ push @value, $control->{'content'} if $control->{'content'};
-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
+ }
+ }
+ }
+ }##tag
+}## if tag is mapped
+return @value;
+}
-=item $biblionumber = &MARCfind_oldbiblionumber_from_MARCbibid($dbh,$MARCbibi);
+sub XML_readline{
+my ($xml,$kohafield,$recordtype,$tag,$subf)=@_;
+#$xml represents one record node hashed of holdings or a complete xml koharecord
+### $recordtype is needed for reading the child records( like holdings records) .Otherwise main record is assumed ( like biblio)
+## holding records are parsed and sent here one by one
+# If kohafieldname given find tag
+
+($tag,$subf)=MARCfind_marc_from_kohafield($kohafield,$recordtype) if $kohafield;
+my @itemresults;
+if ($tag){
+if ($recordtype eq "holdings"){
+ my $item=$xml->{'datafield'};
+ my $hcontrolfield=$xml->{'controlfield'};
+ if ($tag>9){
+ foreach my $data (@$item){
+ if ($data->{'tag'} eq $tag){
+ foreach my $subfield ( $data->{'subfield'}){
+ foreach my $code ( @$subfield){
+ if ($code->{'code'} eq $subf){
+ return $code->{content};
+ }
+ }
+ }
+ }
+ }
+ }else{
+ foreach my $control (@$hcontrolfield){
+ if ($control->{'tag'} eq $tag){
+ return $control->{'content'};
+ }
+ }
+ }##tag
+
+}else{ ##Not a holding read biblio
+my $biblio=$xml->{'record'}->[0]->{'datafield'};
+my $controlfields=$xml->{'record'}->[0]->{'controlfield'};
+ if ($tag>9){
+ foreach my $data (@$biblio){
+ if ($data->{'tag'} eq $tag){
+ foreach my $subfield ( $data->{'subfield'}){
+ foreach my $code ( @$subfield){
+ if ($code->{'code'} eq $subf){
+ return $code->{'content'};
+ }
+ }
+ }
+ }
+ }
+ }else{
+
+ foreach my $control (@$controlfields){
+ if ($control->{'tag'} eq $tag){
+ return $control->{'content'}if $control->{'content'};
+ }
+ }
+ }##tag
+}## Holding or not
+}## if tag is mapped
+return "";
+}
-finds a old-db biblio number for a given MARCbibid number
+sub XML_writeline{
+## This routine modifies one line of marcxml record hash
+my ($xml,$kohafield,$newvalue,$recordtype,$tag,$subf)=@_;
+$newvalue= Encode::decode('utf8',$newvalue) if $newvalue;
+my $biblio=$xml->{'datafield'};
+my $controlfield=$xml->{'controlfield'};
+ ($tag,$subf)=MARCfind_marc_from_kohafield($kohafield,$recordtype) if $kohafield;
+my $updated;
+ if ($tag>9){
+ foreach my $data (@$biblio){
+ if ($data->{'tag'} eq $tag){
+ my @subfields=$data->{'subfield'};
+ my @newsubs;
+ foreach my $subfield ( @subfields){
+ foreach my $code ( @$subfield){
+ if ($code->{'code'} eq $subf){
+ $code->{'content'}=$newvalue;
+ $updated=1;
+ }
+ push @newsubs,$code;
+ }
+ }
+ if (!$updated){
+ push @newsubs,{code=>$subf,content=>$newvalue};
+ $data->{subfield}= \@newsubs;
+ $updated=1;
+ }
+ }
+ }
+ ## Tag did not exist
+ if (!$updated){
+ if ($subf){
+ push @$biblio,
+ {
+ 'ind1' => ' ',
+ 'ind2' => ' ',
+ 'subfield' => [
+ {
+ 'content' =>$newvalue,
+ 'code' => $subf
+ }
+ ],
+ 'tag' =>$tag
+ } ;
+ }else{
+ push @$biblio,
+ {
+ 'ind1' => ' ',
+ 'ind2' => ' ',
+ 'tag' =>$tag
+ } ;
+ }
+ }## created now
+ }elsif ($tag>0){
+ foreach my $control (@$controlfield){
+ if ($control->{'tag'} eq $tag){
+ $control->{'content'}=$newvalue;
+ $updated=1;
+ }
+ }
+ if (!$updated){
+ push @$controlfield,{tag=>$tag,content=>$newvalue};
+ }
+ }
+return $xml;
+}
-=item $bibid = &MARCfind_MARCbibid_from_oldbiblionumber($dbh,$oldbiblionumber);
+sub XML_writeline_id {
+### This routine is similar to XML_writeline but replaces a given value and do not create a new field
+## Useful for repeating fields
+## Currently usedin authorities
+my ($xml,$oldvalue,$newvalue,$tag,$subf)=@_;
+$newvalue= Encode::decode('utf8',$newvalue) if $newvalue;
+my $biblio=$xml->{'datafield'};
+my $controlfield=$xml->{'controlfield'};
+ if ($tag>9){
+ foreach my $data (@$biblio){
+ if ($data->{'tag'} eq $tag){
+ my @subfields=$data->{'subfield'};
+ foreach my $subfield ( @subfields){
+ foreach my $code ( @$subfield){
+ if ($code->{'code'} eq $subf && $code->{'content'} eq $oldvalue){
+ $code->{'content'}=$newvalue;
+ }
+ }
+ }
+ }
+ }
+ }else{
+ foreach my $control(@$controlfield){
+ if ($control->{'tag'} eq $tag && $control->{'content'} eq $oldvalue ){
+ $control->{'content'}=$newvalue;
+ }
+ }
+ }
+return $xml;
+}
-finds a MARC bibid from a old-db biblionumber
+sub XML_xml2hash{
+##make a perl hash from xml file
+my ($xml)=@_;
+ my $hashed = XMLin( $xml ,KeyAttr =>['leader','controlfield','datafield'],ForceArray => ['leader','controlfield','datafield','subfield','holdings','record'],KeepRoot=>0);
+return $hashed;
+}
-=item $MARCRecord = &MARCkoha2marcBiblio($dbh,$biblionumber,biblioitemnumber);
+sub XML_separate{
+##Separates items from biblio
+my $hashed=shift;
+my $biblio=$hashed->{record}->[0];
+my @items;
+my $items=$hashed->{holdings}->[0]->{record};
+foreach my $item (@$items){
+ push @items,$item;
+}
+return ($biblio,@items);
+}
-MARCkoha2marcBiblio is a wrapper between old-DB and MARC-DB. It returns a MARC::Record builded with old-DB biblio/biblioitem
+sub XML_xml2hash_onerecord{
+##make a perl hash from xml file
+my ($xml)=@_;
+return undef unless $xml;
+ my $hashed = XMLin( $xml ,KeyAttr =>['leader','controlfield','datafield'],ForceArray => ['leader','controlfield','datafield','subfield'],KeepRoot=>0);
+return $hashed;
+}
+sub XML_hash2xml{
+## turn a hash back to xml
+my ($hashed,$root)=@_;
+$root="record" unless $root;
+my $xml= XMLout($hashed,KeyAttr=>['leader','controlfıeld','datafield'],NoSort => 1,AttrIndent => 0,KeepRoot=>0,SuppressEmpty => 1,RootName=>$root );
+return $xml;
+}
-=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);
+sub XMLgetbiblio {
+ # Returns MARC::XML of the biblionumber passed in parameter.
+ my ( $dbh, $biblionumber ) = @_;
+ my $sth = $dbh->prepare("select marcxml from biblio where biblionumber=? " );
+ $sth->execute( $biblionumber);
+ my ($marcxml)=$sth->fetchrow;
+ $marcxml=Encode::decode('utf8',$marcxml);
+ return ($marcxml);
+}
-MARCkoha2marcSubtitle is a wrapper between old-DB and MARC-DB. It returns a MARC::Record builded with old-DB subtitle
+sub XMLgetbibliohash{
+## Utility to return s hashed MARCXML
+my ($dbh,$biblionumber)=@_;
+my $xml=XMLgetbiblio($dbh,$biblionumber);
+my $xmlhash=XML_xml2hash_onerecord($xml);
+return $xmlhash;
+}
-=item $olddb = &MARCmarc2koha($dbh,$MARCRecord);
+sub XMLgetitem {
+ # Returns MARC::XML of the item passed in parameter uses either itemnumber or barcode
+ my ( $dbh, $itemnumber,$barcode ) = @_;
+my $sth;
+if ($itemnumber){
+ $sth = $dbh->prepare("select marcxml from items where itemnumber=?" );
+ $sth->execute($itemnumber);
+}else{
+ $sth = $dbh->prepare("select marcxml from items where barcode=?" );
+ $sth->execute($barcode);
+}
+ my ($marcxml)=$sth->fetchrow;
+$marcxml=Encode::decode('utf8',$marcxml);
+ return ($marcxml);
+}
+sub XMLgetitemhash{
+## Utility to return s hashed MARCXML
+ my ( $dbh, $itemnumber,$barcode ) = @_;
+my $xml=XMLgetitem( $dbh, $itemnumber,$barcode);
+my $xmlhash=XML_xml2hash_onerecord($xml);
+return $xmlhash;
+}
-builds a hash with old-db datas from a MARC::Record
-=item &MARCaddbiblio($dbh,$MARC::Record,$biblionumber);
+sub XMLgetallitems {
+# warn "XMLgetallitems";
+ # Returns an array of MARC:XML of the items passed in parameter as biblionumber
+ my ( $dbh, $biblionumber ) = @_;
+my @results;
+my $sth = $dbh->prepare("select marcxml from items where biblionumber =?" );
+ $sth->execute($biblionumber);
-creates a biblio (in the MARC tables only). $biblionumber is the old-db biblionumber of the biblio
+ while(my ($marcxml)=$sth->fetchrow_array){
+$marcxml=Encode::decode('utf8',$marcxml);
+ push @results,$marcxml;
+}
+return @results;
+}
-=item &MARCaddsubfield($dbh,$bibid,$tagid,$indicator,$tagorder,$subfieldcode,$subfieldorder,$subfieldvalue);
+sub XMLmarc2koha {
+# warn "XMLmarc2koha";
+##Returns two hashes from KOHA_XML record hashed
+## A biblio hash and and array of item hashes
+ my ($dbh,$xml,$related_record,@fields) = @_;
+ my ($result,@items);
+
+## if @fields is given do not bother about the rest of fields just parse those
+
+if ($related_record eq "biblios" || $related_record eq "" || !$related_record){
+ if (@fields){
+ foreach my $field(@fields){
+ my $val=&XML_readline($xml,$field,'biblios');
+ $result->{$field}=$val if $val;
+
+ }
+ }else{
+ my $sth2=$dbh->prepare("SELECT kohafield from koha_attr where recordtype like 'biblios' and tagfield is not null" );
+ $sth2->execute();
+ my $field;
+ while ($field=$sth2->fetchrow) {
+ $result->{$field}=&XML_readline($xml,$field,'biblios');
+ }
+ }
-adds a subfield in a biblio (in the MARC tables only).
+## we only need the following for biblio data
+
+# modify copyrightdate to keep only the 1st year found
+ my $temp = $result->{'copyrightdate'};
+ $temp =~ m/c(\d\d\d\d)/; # search cYYYY first
+ if ($1>0) {
+ $result->{'copyrightdate'} = $1;
+ } else { # if no cYYYY, get the 1st date.
+ $temp =~ m/(\d\d\d\d)/;
+ $result->{'copyrightdate'} = $1;
+ }
+# modify publicationyear to keep only the 1st year found
+ $temp = $result->{'publicationyear'};
+ $temp =~ m/c(\d\d\d\d)/; # search cYYYY first
+ if ($1>0) {
+ $result->{'publicationyear'} = $1;
+ } else { # if no cYYYY, get the 1st date.
+ $temp =~ m/(\d\d\d\d)/;
+ $result->{'publicationyear'} = $1;
+ }
+}
+if ($related_record eq "holdings" || $related_record eq "" || !$related_record){
+my $holdings=$xml->{holdings}->[0]->{record};
-=item $MARCRecord = &MARCgetbiblio($dbh,$bibid);
-Returns a MARC::Record for the biblio $bibid.
+ if (@fields){
+ foreach my $holding (@$holdings){
+my $itemresult;
+ foreach my $field(@fields){
+ my $val=&XML_readline($holding,$field,'holdings');
+ $itemresult->{$field}=$val if $val;
+ }
+ push @items, $itemresult;
+ }
+ }else{
+ my $sth2=$dbh->prepare("SELECT kohafield from koha_attr where recordtype like 'holdings' and tagfield is not null" );
+ foreach my $holding (@$holdings){
+ $sth2->execute();
+ my $field;
+my $itemresult;
+ while ($field=$sth2->fetchrow) {
+ $itemresult->{$field}=&XML_readline($xml,$field,'holdings');
+ }
+ push @items, $itemresult;
+ }
+ }
-=item &MARCmodbiblio($dbh,$bibid,$record,$frameworkcode,$delete);
+}
-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);
+ return ($result,@items);
+}
+sub XMLmarc2koha_onerecord {
+# warn "XMLmarc2koha_onerecord";
+##Returns a koha hash from MARCXML hash
-MARCmodsubfield changes the value of a given subfield
+ my ($dbh,$xml,$related_record,@fields) = @_;
+ my ($result);
+
+## if @fields is given do not bother about the rest of fields just parse those
-=item $subfieldid = &MARCfindsubfield($dbh,$bibid,$tag,$subfieldcode,$subfieldorder,$subfieldvalue);
+ if (@fields){
+ foreach my $field(@fields){
+ my $val=&XML_readline_onerecord($xml,$field,$related_record);
+ $result->{$field}=$val if $val;
+ }
+ }else{
+ my $sth2=$dbh->prepare("SELECT kohafield from koha_attr where recordtype like ? and tagfield is not null" );
+ $sth2->execute($related_record);
+ my $field;
+ while ($field=$sth2->fetchrow) {
+ $result->{$field}=&XML_readline_onerecord($xml,$field,$related_record);
+ }
+ }
+ return ($result);
+}
-MARCfindsubfield returns a subfield number given a bibid/tag/subfieldvalue values.
-Returns -1 if more than 1 answer
+sub XMLmodLCindex{
+# warn "XMLmodLCindex";
+my ($dbh,$xmlhash)=@_;
+my ($lc)=XML_readline_onerecord($xmlhash,"classification","biblios");
+my ($cutter)=XML_readline_onerecord($xmlhash,"subclass","biblios");
-=item $subfieldid = &MARCfindsubfieldid($dbh,$bibid,$tag,$tagorder,$subfield,$subfieldorder);
+ if ($lc){
+ $lc.=$cutter;
+ my ($lcsort)=calculatelc($lc);
+ $xmlhash=XML_writeline($xmlhash,"lcsort",$lcsort,"biblios");
+ }
+return $xmlhash;
+}
-MARCfindsubfieldid find a subfieldid for a bibid/tag/tagorder/subfield/subfieldorder
+sub XMLmoditemonefield{
+# This routine takes itemnumber and biblionumber and updates XMLmarc;
+### the ZEBR DB update can wait depending on $donotupdate flag
+my ($dbh,$biblionumber,$itemnumber,$itemfield,$newvalue,$donotupdate)=@_;
+my ($record) = XMLgetitem($dbh,$itemnumber);
+ my $recordhash=XML_xml2hash_onerecord($record);
+ XML_writeline( $recordhash, $itemfield, $newvalue,"holdings" );
+ if($donotupdate){
+ ## Prevent various update calls to zebra wait until all changes finish
+ $record=XML_hash2xml($recordhash);
+ my $sth=$dbh->prepare("update items set marcxml=? where itemnumber=?");
+ $sth->execute($record,$itemnumber);
+ $sth->finish;
+ }else{
+ NEWmoditem($dbh,$recordhash,$biblionumber,$itemnumber);
+ }
-=item &MARCdelsubfield($dbh,$bibid,$tag,$tagorder,$subfield,$subfieldorder);
+}
-MARCdelsubfield delete a subfield for a bibid/tag/tagorder/subfield/subfieldorder
-If $subfieldorder is not set, delete all the $tag$subfield subfields
+sub XMLkoha2marc {
+# warn "MARCkoha2marc";
+## This routine is still used for acqui management
+##Returns a XML recordhash from a kohahash
+ my ($dbh,$result,$recordtype) = @_;
+###create a basic MARCXML
+# find today's date
+my ($sec,$min,$hour,$mday,$mon,$year) = localtime();
+ $year += 1900;
+ $mon += 1;
+ my $timestamp = sprintf("%4d%02d%02d%02d%02d%02d.0",
+ $year,$mon,$mday,$hour,$min,$sec);
+$year=substr($year,2,2);
+ my $accdate=sprintf("%2d%02d%02d",$year,$mon,$mday);
+my ($titletag,$titlesubf)=MARCfind_marc_from_kohafield("title","biblios");
+##create a dummy record
+my $xml="<record><leader> naa a22 7ar4500</leader><controlfield tag='xxx'></controlfield><datafield ind1='' ind2='' tag='$titletag'></datafield></record>";
+## Now build XML
+ my $record = XML_xml2hash($xml);
+ my $sth2=$dbh->prepare("SELECT kohafield from koha_attr where tagfield is not null and recordtype=?");
+ $sth2->execute($recordtype);
+ my $field;
+ while (($field)=$sth2->fetchrow) {
+ $record=XML_writeline($record,$field,$result->{$field},$recordtype) if $result->{$field};
+ }
+return $record;
+}
-=item &MARCdelbiblio($dbh,$bibid);
+#
+#
+# MARC MARC MARC MARC MARC MARC MARC MARC MARC MARC MARC MARC MARC MARC MARC MARC MARC MARC MARC
+#
+## Script to deal with MARCXML related tables
-MARCdelbiblio delete biblio $bibid
-=item &MARCkoha2marcOnefield
+##Sub to match kohafield to Z3950 -attributes
-used by MARCkoha2marc and should not be useful elsewhere
+sub MARCfind_attr_from_kohafield {
+# warn "MARCfind_attr_from_kohafield";
+## returns attribute
+ my ( $kohafield ) = @_;
+ return 0, 0 unless $kohafield;
-=item &MARCmarc2kohaOnefield
+ my $relations = C4::Context->attrfromkohafield;
+ return ($relations->{$kohafield});
+}
-used by MARCmarc2koha and should not be useful elsewhere
-=item MARCaddword
+sub MARCgettagslib {
+# warn "MARCgettagslib";
+ my ( $dbh, $forlibrarian, $frameworkcode ) = @_;
+ $frameworkcode = "" unless $frameworkcode;
+ my $sth;
+ my $libfield = ( $forlibrarian eq 1 ) ? 'liblibrarian' : 'libopac';
-used to manage MARC_word table and should not be useful elsewhere
+ # check that framework exists
+ $sth =
+ $dbh->prepare(
+ "select count(*) from biblios_tag_structure where frameworkcode=?");
+ $sth->execute($frameworkcode);
+ my ($total) = $sth->fetchrow;
+ $frameworkcode = "" unless ( $total > 0 );
+ $sth =
+ $dbh->prepare(
+"select tagfield,liblibrarian,libopac,mandatory,repeatable from biblios_tag_structure where frameworkcode=? order by tagfield"
+ );
+ $sth->execute($frameworkcode);
+ my ( $liblibrarian, $libopac, $tag, $res, $tab, $mandatory, $repeatable );
-=item MARCdelword
+ while ( ( $tag, $liblibrarian, $libopac, $mandatory, $repeatable ) = $sth->fetchrow ) {
+ $res->{$tag}->{lib} = ($forlibrarian or !$libopac)?$liblibrarian:$libopac;
+ $res->{$tab}->{tab} = ""; # XXX
+ $res->{$tag}->{mandatory} = $mandatory;
+ $res->{$tag}->{repeatable} = $repeatable;
+ }
-used to manage MARC_word table and should not be useful elsewhere
+ $sth =
+ $dbh->prepare(
+"select tagfield,tagsubfield,liblibrarian,libopac,tab, mandatory, repeatable,authorised_value,authtypecode,value_builder,seealso,hidden,isurl,link from biblios_subfield_structure where frameworkcode=? order by tagfield,tagsubfield"
+ );
+ $sth->execute($frameworkcode);
-=cut
+ my $subfield;
+ my $authorised_value;
+ my $authtypecode;
+ my $value_builder;
+
+ my $seealso;
+ my $hidden;
+ my $isurl;
+ my $link;
-sub MARCgettagslib {
+ while (
+ ( $tag, $subfield, $liblibrarian, , $libopac, $tab,
+ $mandatory, $repeatable, $authorised_value, $authtypecode,
+ $value_builder, $seealso, $hidden,
+ $isurl, $link )
+ = $sth->fetchrow
+ )
+ {
+ $res->{$tag}->{$subfield}->{lib} = ($forlibrarian or !$libopac)?$liblibrarian:$libopac;
+ $res->{$tag}->{$subfield}->{tab} = $tab;
+ $res->{$tag}->{$subfield}->{mandatory} = $mandatory;
+ $res->{$tag}->{$subfield}->{repeatable} = $repeatable;
+ $res->{$tag}->{$subfield}->{authorised_value} = $authorised_value;
+ $res->{$tag}->{$subfield}->{authtypecode} = $authtypecode;
+ $res->{$tag}->{$subfield}->{value_builder} = $value_builder;
+ $res->{$tag}->{$subfield}->{seealso} = $seealso;
+ $res->{$tag}->{$subfield}->{hidden} = $hidden;
+ $res->{$tag}->{$subfield}->{isurl} = $isurl;
+ $res->{$tag}->{$subfield}->{link} = $link;
+ }
+ return $res;
+}
+sub MARCitemsgettagslib {
+# warn "MARCitemsgettagslib";
my ( $dbh, $forlibrarian, $frameworkcode ) = @_;
$frameworkcode = "" unless $frameworkcode;
my $sth;
# check that framework exists
$sth =
$dbh->prepare(
- "select count(*) from marc_tag_structure where frameworkcode=?");
+ "select count(*) from holdings_tag_structure where frameworkcode=?");
$sth->execute($frameworkcode);
my ($total) = $sth->fetchrow;
$frameworkcode = "" unless ( $total > 0 );
$sth =
$dbh->prepare(
-"select tagfield,liblibrarian,libopac,mandatory,repeatable from marc_tag_structure where frameworkcode=? order by tagfield"
+"select tagfield,liblibrarian,libopac,mandatory,repeatable from holdings_tag_structure where frameworkcode=? order by tagfield"
);
$sth->execute($frameworkcode);
my ( $liblibrarian, $libopac, $tag, $res, $tab, $mandatory, $repeatable );
$sth =
$dbh->prepare(
-"select tagfield,tagsubfield,liblibrarian,libopac,tab, mandatory, repeatable,authorised_value,authtypecode,value_builder,kohafield,seealso,hidden,isurl,link from marc_subfield_structure where frameworkcode=? order by tagfield,tagsubfield"
+"select tagfield,tagsubfield,liblibrarian,libopac,tab, mandatory, repeatable,authorised_value,authtypecode,value_builder,seealso,hidden,isurl,link from holdings_subfield_structure where frameworkcode=? order by tagfield,tagsubfield"
);
$sth->execute($frameworkcode);
my $authorised_value;
my $authtypecode;
my $value_builder;
- my $kohafield;
+
my $seealso;
my $hidden;
my $isurl;
while (
( $tag, $subfield, $liblibrarian, , $libopac, $tab,
$mandatory, $repeatable, $authorised_value, $authtypecode,
- $value_builder, $kohafield, $seealso, $hidden,
+ $value_builder, $seealso, $hidden,
$isurl, $link )
= $sth->fetchrow
)
$res->{$tag}->{$subfield}->{authorised_value} = $authorised_value;
$res->{$tag}->{$subfield}->{authtypecode} = $authtypecode;
$res->{$tag}->{$subfield}->{value_builder} = $value_builder;
- $res->{$tag}->{$subfield}->{kohafield} = $kohafield;
$res->{$tag}->{$subfield}->{seealso} = $seealso;
$res->{$tag}->{$subfield}->{hidden} = $hidden;
$res->{$tag}->{$subfield}->{isurl} = $isurl;
}
return $res;
}
-
sub MARCfind_marc_from_kohafield {
- my ( $dbh, $kohafield,$frameworkcode ) = @_;
+# warn "MARCfind_marc_from_kohafield";
+ my ( $kohafield,$recordtype) = @_;
return 0, 0 unless $kohafield;
+$recordtype="biblios" unless $recordtype;
my $relations = C4::Context->marcfromkohafield;
- return ($relations->{$frameworkcode}->{$kohafield}->[0],$relations->{$frameworkcode}->{$kohafield}->[1]);
+ return ($relations->{$recordtype}->{$kohafield}->[0],$relations->{$recordtype}->{$kohafield}->[1]);
}
-sub MARCfind_oldbiblionumber_from_MARCbibid {
- my ( $dbh, $MARCbibid ) = @_;
+
+
+
+sub MARCfind_frameworkcode {
+# warn "MARCfind_frameworkcode";
+ my ( $dbh, $biblionumber ) = @_;
my $sth =
- $dbh->prepare("select biblionumber from marc_biblio where bibid=?");
- $sth->execute($MARCbibid);
- my ($biblionumber) = $sth->fetchrow;
- return $biblionumber;
+ $dbh->prepare("select frameworkcode from biblio where biblionumber=?");
+ $sth->execute($biblionumber);
+ my ($frameworkcode) = $sth->fetchrow;
+ return $frameworkcode;
}
-
-sub MARCfind_MARCbibid_from_oldbiblionumber {
- my ( $dbh, $oldbiblionumber ) = @_;
+sub MARCfind_itemtype {
+# warn "MARCfind_itemtype";
+ my ( $dbh, $biblionumber ) = @_;
my $sth =
- $dbh->prepare("select bibid from marc_biblio where biblionumber=?");
- $sth->execute($oldbiblionumber);
- my ($bibid) = $sth->fetchrow;
- return $bibid;
-}
-
-sub MARCaddbiblio {
-
-# pass the MARC::Record to this function, and it will create the records in the marc tables
- my ($dbh,$record,$biblionumber,$frameworkcode,$bibid) = @_;
- my @fields=$record->fields();
-# my $bibid;
-# adding main table, and retrieving bibid
-# if bibid is sent, then it's not a true add, it's only a re-add, after a delete (ie, a mod)
- # if bibid empty => true add, find a new bibid number
- unless ($bibid) {
- $dbh->do(
-"lock tables marc_biblio WRITE,marc_subfield_table WRITE, marc_word WRITE, marc_blob_subfield WRITE, stopwords READ"
- );
- my $sth =
- $dbh->prepare(
-"insert into marc_biblio (datecreated,biblionumber,frameworkcode) values (now(),?,?)"
- );
- $sth->execute( $biblionumber, $frameworkcode );
- $sth = $dbh->prepare("select max(bibid) from marc_biblio");
- $sth->execute;
- ($bibid) = $sth->fetchrow;
- $sth->finish;
- }
- my $fieldcount = 0;
-
- # now, add subfields...
- foreach my $field (@fields) {
- $fieldcount++;
- if ( $field->tag() < 10 ) {
- &MARCaddsubfield( $dbh, $bibid, $field->tag(), '', $fieldcount, '',
- 1, $field->data() );
- }
- else {
- my @subfields = $field->subfields();
- foreach my $subfieldcount ( 0 .. $#subfields ) {
- &MARCaddsubfield(
- $dbh,
- $bibid,
- $field->tag(),
- $field->indicator(1) . $field->indicator(2),
- $fieldcount,
- $subfields[$subfieldcount][0],
- $subfieldcount + 1,
- $subfields[$subfieldcount][1]
- );
- }
- }
- }
- # save leader
- &MARCaddsubfield($dbh,$bibid,'000','',$fieldcount+1,'',1,$record->leader);
- $dbh->do("unlock tables");
- return $bibid;
-}
-
-sub MARCadditem {
-
-# pass the MARC::Record to this function, and it will create the records in the marc tables
- my ($dbh,$record,$biblionumber) = @_;
-# search for MARC biblionumber
- $dbh->do("lock tables marc_biblio WRITE,marc_subfield_table WRITE, marc_word WRITE, marc_blob_subfield WRITE, stopwords READ");
- my $bibid = &MARCfind_MARCbibid_from_oldbiblionumber($dbh,$biblionumber);
- my @fields=$record->fields();
- my $sth = $dbh->prepare("select max(tagorder) from marc_subfield_table where bibid=?");
- $sth->execute($bibid);
- my ($fieldcount) = $sth->fetchrow;
-
- # now, add subfields...
- foreach my $field (@fields) {
- my @subfields = $field->subfields();
- $fieldcount++;
- foreach my $subfieldcount ( 0 .. $#subfields ) {
- &MARCaddsubfield(
- $dbh,
- $bibid,
- $field->tag(),
- $field->indicator(1) . $field->indicator(2),
- $fieldcount,
- $subfields[$subfieldcount][0],
- $subfieldcount + 1,
- $subfields[$subfieldcount][1]
- );
- }
- }
- $dbh->do("unlock tables");
- return $bibid;
+ $dbh->prepare("select itemtype from biblio where biblionumber=?");
+ $sth->execute($biblionumber);
+ my ($itemtype) = $sth->fetchrow;
+ return $itemtype;
}
-sub MARCaddsubfield {
-
- # Add a new subfield to a tag into the DB.
- my (
- $dbh, $bibid, $tagid, $tag_indicator,
- $tagorder, $subfieldcode, $subfieldorder, $subfieldvalues
- )
- = @_;
- return unless $subfieldvalues;
-# warn "$tagid / $subfieldcode / $subfieldvalues";
- # if not value, end of job, we do nothing
-# if ( length($subfieldvalues) == 0 ) {
-# return;
-# }
- if ( not($subfieldcode) ) {
- $subfieldcode = ' ';
- }
- my @subfieldvalues = split /\||#/, $subfieldvalues;
- foreach my $subfieldvalue (@subfieldvalues) {
- if ( length($subfieldvalue) > 255 ) {
- $dbh->do(
-"lock tables marc_blob_subfield WRITE, marc_subfield_table WRITE"
- );
- my $sth =
- $dbh->prepare(
- "insert into marc_blob_subfield (subfieldvalue) values (?)");
- $sth->execute($subfieldvalue);
- $sth =
- $dbh->prepare("select max(blobidlink)from marc_blob_subfield");
- $sth->execute;
- my ($res) = $sth->fetchrow;
- $sth =
- $dbh->prepare(
-"insert into marc_subfield_table (bibid,tag,tagorder,tag_indicator,subfieldcode,subfieldorder,valuebloblink) values (?,?,?,?,?,?,?)"
- );
- $sth->execute( $bibid, ( sprintf "%03s", $tagid ), $tagorder,
- $tag_indicator, $subfieldcode, $subfieldorder, $res );
-
- if ( $sth->errstr ) {
- warn
-"ERROR ==> insert into marc_subfield_table (bibid,tag,tagorder,tag_indicator,subfieldcode,subfieldorder,subfieldvalue) values ($bibid,$tagid,$tagorder,$tag_indicator,$subfieldcode,$subfieldorder,$subfieldvalue)\n";
- }
- $dbh->do("unlock tables");
- }
- else {
- my $sth =
- $dbh->prepare(
-"insert into marc_subfield_table (bibid,tag,tagorder,tag_indicator,subfieldcode,subfieldorder,subfieldvalue) values (?,?,?,?,?,?,?)"
- );
- $sth->execute(
- $bibid, ( sprintf "%03s", $tagid ),
- $tagorder, $tag_indicator,
- $subfieldcode, $subfieldorder,
- $subfieldvalue
- );
- if ( $sth->errstr ) {
- warn
-"ERROR ==> insert into marc_subfield_table (bibid,tag,tagorder,tag_indicator,subfieldcode,subfieldorder,subfieldvalue) values ($bibid,$tagid,$tagorder,$tag_indicator,$subfieldcode,$subfieldorder,$subfieldvalue)\n";
- }
- }
- &MARCaddword(
- $dbh, $bibid, $tagid, $tagorder,
- $subfieldcode, $subfieldorder, $subfieldvalue
- );
- }
-}
-sub MARCgetbiblio {
- # Returns MARC::Record of the biblio passed in parameter.
- my ( $dbh, $biblionumber ) = @_;
- my $sth = $dbh->prepare('select marc from biblioitems where biblionumber=?');
- $sth->execute($biblionumber);
- my ($marc) = $sth->fetchrow;
- my $record = MARC::File::USMARC::decode($marc);
- return $record;
-}
-
-sub MARCgetitem {
-
- my ( $dbh, $biblionumber, $itemnumber ) = @_;
- my $frameworkcode=MARCfind_frameworkcode($dbh,$biblionumber);
- # get the complete MARC record
- my $sth = $dbh->prepare("select marc from biblioitems where biblionumber=?");
- $sth->execute($biblionumber);
- my ($rawmarc) = $sth->fetchrow;
- my $record = MARC::File::USMARC::decode($rawmarc);
- # now, find the relevant itemnumber
- my ($itemnumberfield,$itemnumbersubfield) = MARCfind_marc_from_kohafield($dbh,'items.itemnumber',$frameworkcode);
- # prepare the new item record
- my $itemrecord = MARC::Record->new();
- # parse all fields fields from the complete record
- foreach ($record->field($itemnumberfield)) {
- # when the item field is found, save it
- if ($_->subfield($itemnumbersubfield) == $itemnumber) {
- $itemrecord->append_fields($_);
+sub MARChtml2xml {
+# warn "MARChtml2xml ";
+ my ($tags,$subfields,$values,$indicator,$ind_tag,$tagindex) = @_;
+ my $xml= "<record>";
+
+ my $prevvalue;
+ my $prevtag=-1;
+ my $first=1;
+ my $j = -1;
+ for (my $i=0;$i<=@$tags;$i++){
+ @$values[$i] =~ s/&/&/g;
+ @$values[$i] =~ s/</</g;
+ @$values[$i] =~ s/>/>/g;
+ @$values[$i] =~ s/"/"/g;
+ @$values[$i] =~ s/'/'/g;
+
+ if ((@$tags[$i].@$tagindex[$i] ne $prevtag)){
+ my $tag=@$tags[$i];
+ $j++ unless ($tag eq "");
+ ## warn "IND:".substr(@$indicator[$j],0,1).substr(@$indicator[$j],1,1)." ".@$tags[$i];
+ if (!$first){
+ $xml.="</datafield>\n";
+ if (($tag> 10) && (@$values[$i] ne "")){
+ my $ind1 = substr(@$indicator[$j],0,1);
+ my $ind2 = substr(@$indicator[$j],1,1);
+ $xml.="<datafield tag=\"$tag\" ind1=\"$ind1\" ind2=\"$ind2\">\n";
+ $xml.="<subfield code=\"@$subfields[$i]\">@$values[$i]</subfield>\n";
+ $first=0;
+ } else {
+ $first=1;
+ }
+ } else {
+ if (@$values[$i] ne "") {
+ # leader
+ if ($tag eq "000") {
+ ##Force the leader to UTF8
+ substr(@$values[$i],9,1)="a";
+ $xml.="<leader>@$values[$i]</leader>\n";
+ $first=1;
+ # rest of the fixed fields
+ } elsif ($tag < 10) {
+ $xml.="<controlfield tag=\"$tag\">@$values[$i]</controlfield>\n";
+ $first=1;
+ } else {
+ my $ind1 = substr(@$indicator[$j],0,1);
+ my $ind2 = substr(@$indicator[$j],1,1);
+ $xml.="<datafield tag=\"$tag\" ind1=\"$ind1\" ind2=\"$ind2\">\n";
+ $xml.="<subfield code=\"@$subfields[$i]\">@$values[$i]</subfield>\n";
+ $first=0;
+ }
+ }
+ }
+ } else { # @$tags[$i] eq $prevtag
+ unless (@$values[$i] eq "") {
+ my $tag=@$tags[$i];
+ if ($first){
+ my $ind1 = substr(@$indicator[$j],0,1);
+ my $ind2 = substr(@$indicator[$j],1,1);
+ $xml.="<datafield tag=\"$tag\" ind1=\"$ind1\" ind2=\"$ind2\">\n";
+ $first=0;
+ }
+ $xml.="<subfield code=\"@$subfields[$i]\">@$values[$i]</subfield>\n";
+ }
}
+ $prevtag = @$tags[$i].@$tagindex[$i];
}
+ $xml.="</record>";
+ # warn $xml;
+ $xml=Encode::decode('utf8',$xml);
+ return $xml;
+}
+sub XML_record_header {
+#### this one is for <record>
+ my $format = shift;
+ my $enc = shift || 'UTF-8';
+##
+ return( <<MARC_XML_HEADER );
+<?xml version="1.0" encoding="$enc"?>
+<record xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://www.loc.gov/MARC21/slim http://www.loc.gov/standards/marcxml/schema/MARC21slim.xsd"
+ xmlns="http://www.loc.gov/MARC21/slim">
+MARC_XML_HEADER
+}
- return $itemrecord;
-}
-
-sub MARCmodbiblio {
- my ($dbh,$bibid,$record,$frameworkcode,$delete)=@_;
-# 1st delete the biblio,
-# 2nd recreate it
- my $biblionumber = MARCfind_oldbiblionumber_from_MARCbibid($dbh,$bibid);
- &MARCdelbiblio($dbh,$bibid,1);
- &MARCaddbiblio($dbh,$record,$biblionumber,$frameworkcode,$bibid);
-}
-
-sub MARCdelbiblio {
- my ( $dbh, $bibid, $keep_items ) = @_;
-
- # if the keep_item is set to 1, then all items are preserved.
- # This flag is set when the delbiblio is called by modbiblio
- # due to a too complex structure of MARC (repeatable fields and subfields),
- # the best solution for a modif is to delete / recreate the record.
-
-# 1st of all, copy the MARC::Record to deletedbiblio table => if a true deletion, MARC data will be kept.
-# if deletion called before MARCmodbiblio => won't do anything, as the oldbiblionumber doesn't
- # exist in deletedbiblio table
- my $record = MARCgetbiblio( $dbh, $bibid );
- my $oldbiblionumber =
- MARCfind_oldbiblionumber_from_MARCbibid( $dbh, $bibid );
- my $copy2deleted =
- $dbh->prepare("update deletedbiblio set marc=? where biblionumber=?");
- $copy2deleted->execute( $record->as_usmarc(), $oldbiblionumber );
-
- # now, delete in MARC tables.
- if ( $keep_items eq 1 ) {
-
- #search item field code
- my $sth =
- $dbh->prepare(
-"select tagfield from marc_subfield_structure where kohafield like 'items.%'"
- );
- $sth->execute;
- my $itemtag = $sth->fetchrow_hashref->{tagfield};
- $dbh->do(
-"delete from marc_subfield_table where bibid=$bibid and tag<>$itemtag"
- );
- $dbh->do(
-"delete from marc_word where bibid=$bibid and not (tagsubfield like \"$itemtag%\")"
- );
- }
- else {
- $dbh->do("delete from marc_biblio where bibid=$bibid");
- $dbh->do("delete from marc_subfield_table where bibid=$bibid");
- $dbh->do("delete from marc_word where bibid=$bibid");
- }
+
+sub collection_header {
+#### this one is for koha collection
+ my $format = shift;
+ my $enc = shift || 'UTF-8';
+ return( <<KOHA_XML_HEADER );
+<?xml version="1.0" encoding="$enc"?>
+<kohacollection xmlns:marc="http://loc.gov/MARC21/slim" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="http://library.neu.edu.tr/kohanamespace/koharecord.xsd">
+KOHA_XML_HEADER
}
-sub MARCdelitem {
- # delete the item passed in parameter in MARC tables.
- my ( $dbh, $bibid, $itemnumber ) = @_;
- # my $record = MARC::Record->new();
- # search MARC tagorder
- my $record = MARCgetitem( $dbh, $bibid, $itemnumber );
- my $copy2deleted =
- $dbh->prepare("update deleteditems set marc=? where itemnumber=?");
- $copy2deleted->execute( $record->as_usmarc(), $itemnumber );
- my $sth2 =
- $dbh->prepare(
-"select tagorder from marc_subfield_table,marc_subfield_structure where marc_subfield_table.tag=marc_subfield_structure.tagfield and marc_subfield_table.subfieldcode=marc_subfield_structure.tagsubfield and bibid=? and kohafield='items.itemnumber' and subfieldvalue=?"
- );
- $sth2->execute( $bibid, $itemnumber );
- my ($tagorder) = $sth2->fetchrow_array();
- my $sth =
- $dbh->prepare(
- "delete from marc_subfield_table where bibid=? and tagorder=?");
- $sth->execute( $bibid, $tagorder );
+
+
+
+
+##########################NEW NEW NEW#############################
+sub NEWnewbiblio {
+ my ( $dbh, $xml, $frameworkcode) = @_;
+$frameworkcode="" unless $frameworkcode;
+my $biblionumber=XML_readline_onerecord($xml,"biblionumber","biblios");
+## In case reimporting records with biblionumbers keep them
+if ($biblionumber){
+$biblionumber=NEWmodbiblio( $dbh, $biblionumber,$xml,$frameworkcode );
+}else{
+ $biblionumber = NEWaddbiblio( $dbh, $xml,$frameworkcode );
}
-sub MARCmoditem {
- my ($dbh,$record,$bibid,$itemnumber,$delete)=@_;
- my $biblionumber = MARCfind_oldbiblionumber_from_MARCbibid($dbh,$bibid);
- &MARCdelitem($dbh,$bibid,$itemnumber);
- &MARCadditem($dbh,$record,$biblionumber);
+ return ( $biblionumber );
}
-sub MARCmodsubfield {
- # Subroutine changes a subfield value given a subfieldid.
- my ( $dbh, $subfieldid, $subfieldvalue ) = @_;
- $dbh->do("lock tables marc_blob_subfield WRITE,marc_subfield_table WRITE");
- my $sth1 =
- $dbh->prepare(
- "select valuebloblink from marc_subfield_table where subfieldid=?");
- $sth1->execute($subfieldid);
- my ($oldvaluebloblink) = $sth1->fetchrow;
- $sth1->finish;
- my $sth;
- # if too long, use a bloblink
- if ( length($subfieldvalue) > 255 ) {
- # if already a bloblink, update it, otherwise, insert a new one.
- if ($oldvaluebloblink) {
- $sth =
- $dbh->prepare(
-"update marc_blob_subfield set subfieldvalue=? where blobidlink=?"
- );
- $sth->execute( $subfieldvalue, $oldvaluebloblink );
- }
- else {
- $sth =
- $dbh->prepare(
- "insert into marc_blob_subfield (subfieldvalue) values (?)");
- $sth->execute($subfieldvalue);
- $sth =
- $dbh->prepare("select max(blobidlink) from marc_blob_subfield");
- $sth->execute;
- my ($res) = $sth->fetchrow;
- $sth =
- $dbh->prepare(
-"update marc_subfield_table set subfieldvalue=null, valuebloblink=? where subfieldid=?"
- );
- $sth->execute( $res, $subfieldid );
- }
- }
- else {
-
-# note this can leave orphan bloblink. Not a big problem, but we should build somewhere a orphan deleting script...
- $sth =
- $dbh->prepare(
-"update marc_subfield_table set subfieldvalue=?,valuebloblink=null where subfieldid=?"
- );
- $sth->execute( $subfieldvalue, $subfieldid );
- }
- $dbh->do("unlock tables");
- $sth->finish;
- $sth =
- $dbh->prepare(
-"select bibid,tag,tagorder,subfieldcode,subfieldid,subfieldorder from marc_subfield_table where subfieldid=?"
- );
- $sth->execute($subfieldid);
- my ( $bibid, $tagid, $tagorder, $subfieldcode, $x, $subfieldorder ) =
- $sth->fetchrow;
- $subfieldid = $x;
- &MARCdelword( $dbh, $bibid, $tagid, $tagorder, $subfieldcode,
- $subfieldorder );
- &MARCaddword(
- $dbh, $bibid, $tagid, $tagorder,
- $subfieldcode, $subfieldorder, $subfieldvalue
- );
- return ( $subfieldid, $subfieldvalue );
-}
-
-sub MARCfindsubfield {
- my ( $dbh, $bibid, $tag, $subfieldcode, $subfieldorder, $subfieldvalue ) =
- @_;
- my $resultcounter = 0;
- my $subfieldid;
- my $lastsubfieldid;
- my $query =
-"select subfieldid from marc_subfield_table where bibid=? and tag=? and subfieldcode=?";
- my @bind_values = ( $bibid, $tag, $subfieldcode );
- if ($subfieldvalue) {
- $query .= " and subfieldvalue=?";
- push ( @bind_values, $subfieldvalue );
- }
- else {
- if ( $subfieldorder < 1 ) {
- $subfieldorder = 1;
- }
- $query .= " and subfieldorder=?";
- push ( @bind_values, $subfieldorder );
- }
- my $sti = $dbh->prepare($query);
- $sti->execute(@bind_values);
- while ( ($subfieldid) = $sti->fetchrow ) {
- $resultcounter++;
- $lastsubfieldid = $subfieldid;
- }
- if ( $resultcounter > 1 ) {
-# Error condition. Values given did not resolve into a unique record. Don't know what to edit
-# should rarely occur (only if we use subfieldvalue with a value that exists twice, which is strange)
- return -1;
- }
- else {
- return $lastsubfieldid;
- }
+sub NEWmodbiblioframework {
+ my ($dbh,$biblionumber,$frameworkcode) =@_;
+ my $sth = $dbh->prepare("Update biblio SET frameworkcode=? WHERE biblionumber=$biblionumber");
+ $sth->execute($frameworkcode);
+ return 1;
}
-sub MARCfindsubfieldid {
- my ( $dbh, $bibid, $tag, $tagorder, $subfield, $subfieldorder ) = @_;
- my $sth = $dbh->prepare( "select subfieldid from marc_subfield_table
- where bibid=? and tag=? and tagorder=?
- and subfieldcode=? and subfieldorder=?"
- );
- $sth->execute( $bibid, $tag, $tagorder, $subfield, $subfieldorder );
- my ($res) = $sth->fetchrow;
- unless ($res) {
- $sth = $dbh->prepare( "select subfieldid from marc_subfield_table
- where bibid=? and tag=? and tagorder=?
- and subfieldcode=?"
- );
- $sth->execute( $bibid, $tag, $tagorder, $subfield );
- ($res) = $sth->fetchrow;
- }
- return $res;
-}
-sub find_biblioitemnumber {
- my ( $dbh, $biblionumber ) = @_;
- my $sth = $dbh->prepare("select biblioitemnumber from biblioitems where biblionumber=?");
- $sth->execute($biblionumber);
- my ($biblioitemnumber) = $sth->fetchrow;
- return $biblioitemnumber;
+sub NEWdelbiblio {
+ my ( $dbh, $biblionumber ) = @_;
+ZEBRAop($dbh,$biblionumber,"recordDelete","biblioserver");
}
-sub MARCfind_frameworkcode {
- my ( $dbh, $biblionumber ) = @_;
- my $sth = $dbh->prepare("select frameworkcode from biblio where biblionumber=?");
- $sth->execute($biblionumber);
- my ($frameworkcode) = $sth->fetchrow;
- return $frameworkcode;
-}
-
-sub MARCdelsubfield {
-
- # delete a subfield for $bibid / tag / tagorder / subfield / subfieldorder
- my ( $dbh, $bibid, $tag, $tagorder, $subfield, $subfieldorder ) = @_;
- if ($subfieldorder) {
- $dbh->do( "delete from marc_subfield_table where bibid='$bibid' and
- tag='$tag' and tagorder='$tagorder'
- and subfieldcode='$subfield' and subfieldorder='$subfieldorder'
- "
- );
- $dbh->do( "delete from marc_word where bibid='$bibid' and
- tagsubfield='$tag$subfield' and tagorder='$tagorder'
- and subfieldorder='$subfieldorder'
- "
- );
- } else {
- $dbh->do( "delete from marc_subfield_table where bibid='$bibid' and
- tag='$tag' and tagorder='$tagorder'
- and subfieldcode='$subfield'"
- );
- $dbh->do( "delete from marc_word where bibid='$bibid' and
- tagsubfield='$tag$subfield' and tagorder='$tagorder'"
- );
+
+sub NEWnewitem {
+ my ( $dbh, $xmlhash, $biblionumber ) = @_;
+ my $itemtype= MARCfind_itemtype($dbh,$biblionumber);
+
+## In case we are re-importing marc records from bulk import do not change itemnumbers
+my $itemnumber=XML_readline_onerecord($xmlhash,"itemnumber","holdings");
+if ($itemnumber){
+NEWmoditem ( $dbh, $xmlhash, $biblionumber, $itemnumber);
+}else{
+
+##Add biblionumber to $record
+$xmlhash=XML_writeline($xmlhash,"biblionumber",$biblionumber,"holdings");
+ my $sth=$dbh->prepare("select notforloan from itemtypes where itemtype='$itemtype'");
+$sth->execute();
+my $notforloan=$sth->fetchrow;
+##Change the notforloan field if $notforloan found
+ if ($notforloan >0){
+ $xmlhash=XML_writeline($xmlhash,"notforloan",$notforloan,"holdings");
}
+my $dateaccessioned=XML_readline_onerecord($xmlhash,"dateaccessioned","holdings");
+unless($dateaccessioned){
+# find today's date
+my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) =
+localtime(time); $year +=1900; $mon +=1;
+my $date = "$year-".sprintf ("%0.2d", $mon)."-".sprintf("%0.2d",$mday);
+
+$xmlhash=XML_writeline($xmlhash,"dateaccessioned",$date,"holdings");
}
-
-sub MARCkoha2marcBiblio {
-
- # this function builds partial MARC::Record from the old koha-DB fields
- my ( $dbh, $biblionumber, $biblioitemnumber ) = @_;
- my $sth =
- $dbh->prepare(
-"select tagfield,tagsubfield from marc_subfield_structure where frameworkcode=? and kohafield=?"
- );
- my $record = MARC::Record->new();
-
- #--- if bibid, then retrieve old-style koha data
- if ( $biblionumber > 0 ) {
- my $sth2 =
- $dbh->prepare(
-"select biblionumber,author,title,unititle,notes,abstract,serial,seriestitle,copyrightdate,timestamp
- from biblio where biblionumber=?"
- );
- $sth2->execute($biblionumber);
- my $row = $sth2->fetchrow_hashref;
- my $code;
- foreach $code ( keys %$row ) {
- if ( $row->{$code} ) {
- &MARCkoha2marcOnefield( $sth, $record, "biblio." . $code,
- $row->{$code}, '');
- }
- }
- }
-
- #--- if biblioitem, then retrieve old-style koha data
- if ( $biblioitemnumber > 0 ) {
- my $sth2 =
- $dbh->prepare(
- " SELECT biblioitemnumber,biblionumber,volume,number,classification,
- itemtype,url,isbn,issn,dewey,subclass,publicationyear,publishercode,
- volumedate,volumeddesc,timestamp,illus,pages,notes AS bnotes,size,place
- FROM biblioitems
- WHERE biblioitemnumber=?
- "
- );
- $sth2->execute($biblioitemnumber);
- my $row = $sth2->fetchrow_hashref;
- my $code;
- foreach $code ( keys %$row ) {
- if ( $row->{$code} ) {
- &MARCkoha2marcOnefield( $sth, $record, "biblioitems." . $code,
- $row->{$code},'' );
- }
- }
- }
-
- # other fields => additional authors, subjects, subtitles
- my $sth2 =
- $dbh->prepare(
- " SELECT author FROM additionalauthors WHERE biblionumber=?");
- $sth2->execute($biblionumber);
- while ( my $row = $sth2->fetchrow_hashref ) {
- &MARCkoha2marcOnefield( $sth, $record, "additionalauthors.author",
- $row->{'author'},'' );
- }
- $sth2 =
- $dbh->prepare(" SELECT subject FROM bibliosubject WHERE biblionumber=?");
- $sth2->execute($biblionumber);
- while ( my $row = $sth2->fetchrow_hashref ) {
- &MARCkoha2marcOnefield( $sth, $record, "bibliosubject.subject",
- $row->{'subject'},'' );
- }
- $sth2 =
- $dbh->prepare(
- " SELECT subtitle FROM bibliosubtitle WHERE biblionumber=?");
- $sth2->execute($biblionumber);
- while ( my $row = $sth2->fetchrow_hashref ) {
- &MARCkoha2marcOnefield( $sth, $record, "bibliosubtitle.subtitle",
- $row->{'subtitle'},'' );
- }
- return $record;
+
+## Now calculate itempart of cutter-- This is NEU specific
+my $itemcallnumber=XML_readline_onerecord($xmlhash,"itemcallnumber","holdings");
+if ($itemcallnumber){
+my ($cutterextra)=itemcalculator($dbh,$biblionumber,$itemcallnumber);
+$xmlhash=XML_writeline($xmlhash,"cutterextra",$cutterextra,"holdings");
}
-sub MARCkoha2marcItem {
-
- # this function builds partial MARC::Record from the old koha-DB fields
- my ( $dbh, $biblionumber, $itemnumber ) = @_;
+##NEU specific add cataloguers cardnumber as well
+my $me= C4::Context->userenv;
+my $cataloger=$me->{'cardnumber'} if ($me);
+$xmlhash=XML_writeline($xmlhash,"circid",$cataloger,"holdings") if $cataloger;
- # my $dbh=&C4Connect;
- my $sth =
- $dbh->prepare(
-"select tagfield,tagsubfield from marc_subfield_structure where frameworkcode=? and kohafield=?"
- );
- my $record = MARC::Record->new();
-
- #--- if item, then retrieve old-style koha data
- if ( $itemnumber > 0 ) {
-
- # print STDERR "prepare $biblionumber,$itemnumber\n";
- my $sth2 =
- $dbh->prepare(
-"SELECT itemnumber,biblionumber,multivolumepart,biblioitemnumber,barcode,dateaccessioned,
- booksellerid,homebranch,price,replacementprice,replacementpricedate,datelastborrowed,
- datelastseen,multivolume,stack,notforloan,itemlost,wthdrawn,itemcallnumber,issues,renewals,
- reserves,restricted,binding,itemnotes,holdingbranch,timestamp
- FROM items
- WHERE itemnumber=?"
- );
- $sth2->execute($itemnumber);
- my $row = $sth2->fetchrow_hashref;
- my $code;
- foreach $code ( keys %$row ) {
- if ( $row->{$code} ) {
- &MARCkoha2marcOnefield( $sth, $record, "items." . $code,
- $row->{$code},'' );
- }
- }
- }
- return $record;
-}
+##Add item to SQL
+my $itemnumber = &OLDnewitems( $dbh, $xmlhash );
-sub MARCkoha2marcSubtitle {
+# add the item to zebra it will add the biblio as well!!!
+ ZEBRAop( $dbh, $biblionumber,"specialUpdate","biblioserver" );
+return $itemnumber;
+}## added new item
- # 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;
-}
-
-sub MARCkoha2marcOnefield {
- my ( $sth, $record, $kohafieldname, $value,$frameworkcode ) = @_;
- my $tagfield;
- my $tagsubfield;
- $sth->execute($frameworkcode,$kohafieldname);
- if ( ( $tagfield, $tagsubfield ) = $sth->fetchrow ) {
- if ( $record->field($tagfield) ) {
- my $tag = $record->field($tagfield);
- if ($tag) {
- $tag->add_subfields( $tagsubfield, $value );
- $record->delete_field($tag);
- $record->add_fields($tag);
- }
- }
- else {
- $record->add_fields( $tagfield, " ", " ", $tagsubfield => $value );
- }
- }
- return $record;
-}
-
-sub MARChtml2marc {
- my ($dbh,$rtags,$rsubfields,$rvalues,%indicators) = @_;
- my $prevtag = -1;
- my $record = MARC::Record->new();
-# my %subfieldlist=();
- my $prevvalue; # if tag <10
- my $field; # if tag >=10
- for (my $i=0; $i< @$rtags; $i++) {
- next unless @$rvalues[$i];
- # rebuild MARC::Record
-# warn "0=>".@$rtags[$i].@$rsubfields[$i]." = ".@$rvalues[$i].": ";
- if (@$rtags[$i] ne $prevtag) {
- if ($prevtag < 10) {
- if ($prevvalue) {
- if ($prevtag ne '000') {
- $record->add_fields((sprintf "%03s",$prevtag),$prevvalue);
- } else {
- $record->leader($prevvalue);
- }
- }
- } else {
- if ($field) {
- $record->add_fields($field);
- }
- }
- $indicators{@$rtags[$i]}.=' ';
- if (@$rtags[$i] <10) {
- $prevvalue= @$rvalues[$i];
- undef $field;
- } else {
- undef $prevvalue;
- $field = MARC::Field->new( (sprintf "%03s",@$rtags[$i]), substr($indicators{@$rtags[$i]},0,1),substr($indicators{@$rtags[$i]},1,1), @$rsubfields[$i] => @$rvalues[$i]);
-# warn "1=>".@$rtags[$i].@$rsubfields[$i]." = ".@$rvalues[$i].": ".$field->as_formatted;
- }
- $prevtag = @$rtags[$i];
- } else {
- if (@$rtags[$i] <10) {
- $prevvalue=@$rvalues[$i];
- } else {
- if (length(@$rvalues[$i])>0) {
- $field->add_subfields(@$rsubfields[$i] => @$rvalues[$i]);
-# warn "2=>".@$rtags[$i].@$rsubfields[$i]." = ".@$rvalues[$i].": ".$field->as_formatted;
- }
- }
- $prevtag= @$rtags[$i];
- }
- }
- # the last has not been included inside the loop... do it now !
- $record->add_fields($field) if $field;
-# warn "HTML2MARC=".$record->as_formatted;
- return $record;
-}
-
-sub MARCmarc2koha {
- my ($dbh,$record,$frameworkcode) = @_;
- my $sth=$dbh->prepare("select tagfield,tagsubfield from marc_subfield_structure where frameworkcode=? and kohafield=?");
- my $result;
- my $sth2=$dbh->prepare("SHOW COLUMNS from biblio");
- $sth2->execute;
- my $field;
- while (($field)=$sth2->fetchrow) {
- $result=&MARCmarc2kohaOneField($sth,"biblio",$field,$record,$result,$frameworkcode);
- }
- $sth2=$dbh->prepare("SHOW COLUMNS from biblioitems");
- $sth2->execute;
- while (($field)=$sth2->fetchrow) {
- if ($field eq 'notes') { $field = 'bnotes'; }
- $result=&MARCmarc2kohaOneField($sth,"biblioitems",$field,$record,$result,$frameworkcode);
- }
- $sth2=$dbh->prepare("SHOW COLUMNS from items");
- $sth2->execute;
- while (($field)=$sth2->fetchrow) {
- $result=&MARCmarc2kohaOneField($sth,"items",$field,$record,$result,$frameworkcode);
- }
- # additional authors : specific
- $result = &MARCmarc2kohaOneField($sth,"bibliosubtitle","subtitle",$record,$result,$frameworkcode);
- $result = &MARCmarc2kohaOneField($sth,"additionalauthors","additionalauthors",$record,$result,$frameworkcode);
-# modify copyrightdate to keep only the 1st year found
- my $temp = $result->{'copyrightdate'};
- $temp =~ m/c(\d\d\d\d)/; # search cYYYY first
- if ($1>0) {
- $result->{'copyrightdate'} = $1;
- } else { # if no cYYYY, get the 1st date.
- $temp =~ m/(\d\d\d\d)/;
- $result->{'copyrightdate'} = $1;
- }
-# modify publicationyear to keep only the 1st year found
- $temp = $result->{'publicationyear'};
- $temp =~ m/c(\d\d\d\d)/; # search cYYYY first
- if ($1>0) {
- $result->{'publicationyear'} = $1;
- } else { # if no cYYYY, get the 1st date.
- $temp =~ m/(\d\d\d\d)/;
- $result->{'publicationyear'} = $1;
- }
- return $result;
}
-sub MARCmarc2kohaOneField {
-# FIXME ? if a field has a repeatable subfield that is used in old-db, only the 1st will be retrieved...
- my ( $sth, $kohatable, $kohafield, $record, $result,$frameworkcode ) = @_;
- # warn "kohatable / $kohafield / $result / ";
- my $res = "";
- my $tagfield;
- my $subfield;
- ( $tagfield, $subfield ) = MARCfind_marc_from_kohafield("",$kohatable.".".$kohafield,$frameworkcode);
- foreach my $field ( $record->field($tagfield) ) {
- if ($field->tag()<10) {
- if ($result->{$kohafield}) {
- $result->{$kohafield} .= " | ".$field->data();
- } else {
- $result->{$kohafield} = $field->data();
- }
- } else {
- if ( $field->subfields ) {
- my @subfields = $field->subfields();
- foreach my $subfieldcount ( 0 .. $#subfields ) {
- if ($subfields[$subfieldcount][0] eq $subfield) {
- if ( $result->{$kohafield} ) {
- $result->{$kohafield} .= " | " . $subfields[$subfieldcount][1];
- }
- else {
- $result->{$kohafield} = $subfields[$subfieldcount][1];
- }
- }
- }
- }
- }
- }
-# warn "OneField for $kohatable.$kohafield and $frameworkcode=> $tagfield, $subfield";
- return $result;
-}
-sub MARCaddword {
+sub NEWmoditem{
+ my ( $dbh, $xmlhash, $biblionumber, $itemnumber ) = @_;
- # split a subfield string and adds it into the word table.
- # removes stopwords
- my (
- $dbh, $bibid, $tag, $tagorder,
- $subfieldid, $subfieldorder, $sentence
- )
- = @_;
- $sentence =~ s/(\.|\?|\:|\!|\'|,|\-|\"|\(|\)|\[|\]|\{|\}|\/)/ /g;
- my @words = split / /, $sentence;
- my $stopwords = C4::Context->stopwords;
- my $sth =
- $dbh->prepare(
-"insert into marc_word (bibid, tagsubfield, tagorder, subfieldorder, word, sndx_word)
- values (?,concat(?,?),?,?,?,soundex(?))"
- );
- foreach my $word (@words) {
-# we record only words one char long and not in stopwords hash
- if (length($word)>=1 and !($stopwords->{uc($word)})) {
- $sth->execute($bibid,$tag,$subfieldid,$tagorder,$subfieldorder,$word,$word);
- if ($sth->err()) {
- warn "ERROR ==> insert into marc_word (bibid, tagsubfield, tagorder, subfieldorder, word, sndx_word) values ($bibid,concat($tag,$subfieldid),$tagorder,$subfieldorder,$word,soundex($word))\n";
- }
- }
- }
+##Add itemnumber incase lost (old bug 090c was lost sometimes) --just incase
+$xmlhash=XML_writeline($xmlhash,"itemnumber",$itemnumber,"holdings");
+##Add biblionumber incase lost on html
+$xmlhash=XML_writeline($xmlhash,"biblionumber",$biblionumber,"holdings");
+##Read barcode
+my $barcode=XML_readline_onerecord($xmlhash,"barcode","holdings");
+## Now calculate itempart of cutter-- This is NEU specific
+my $itemcallnumber=XML_readline_onerecord($xmlhash,"itemcallnumber","holdings");
+if ($itemcallnumber){
+my ($cutterextra)=itemcalculator($dbh,$biblionumber,$itemcallnumber);
+$xmlhash=XML_writeline($xmlhash,"cutterextra",$cutterextra,"holdings");
}
-sub MARCdelword {
-
-# delete words. this sub deletes all the words from a sentence. a subfield modif is done by a delete then a add
- my ( $dbh, $bibid, $tag, $tagorder, $subfield, $subfieldorder ) = @_;
- my $sth =
- $dbh->prepare(
-"delete from marc_word where bibid=? and tagsubfield=concat(?,?) and tagorder=? and subfieldorder=?"
- );
- $sth->execute( $bibid, $tag, $subfield, $tagorder, $subfieldorder );
+##NEU specific add cataloguers cardnumber as well
+my $me= C4::Context->userenv;
+my $cataloger=$me->{'cardnumber'} if ($me);
+$xmlhash=XML_writeline($xmlhash,"circid",$cataloger,"holdings") if $cataloger;
+my $xml=XML_hash2xml($xmlhash);
+ OLDmoditem( $dbh, $xml,$biblionumber,$itemnumber,$barcode );
+ ZEBRAop($dbh,$biblionumber,"specialUpdate","biblioserver");
}
-#
-#
-# 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
-#
+sub NEWdelitem {
+ my ( $dbh, $itemnumber ) = @_;
+my $sth=$dbh->prepare("SELECT biblionumber from items where itemnumber=?");
+$sth->execute($itemnumber);
+my $biblionumber=$sth->fetchrow;
+OLDdelitem( $dbh, $itemnumber ) ;
+ZEBRAop($dbh,$biblionumber,"specialUpdate","biblioserver");
-=item ($bibid,$oldbibnum,$oldbibitemnum) = NEWnewbibilio($dbh,$MARCRecord,$frameworkcode);
+}
-creates a biblio from a MARC::Record.
-=item NEWnewitem($dbh, $record,$bibid);
-creates an item from a MARC::Record
-=cut
+sub NEWaddbiblio {
+ my ( $dbh, $xmlhash,$frameworkcode ) = @_;
+ my $sth = $dbh->prepare("Select max(biblionumber) from biblio");
+ $sth->execute;
+ my $data = $sth->fetchrow;
+ my $biblionumber = $data + 1;
+ $sth->finish;
+ # we must add biblionumber
+my $record;
+$xmlhash=XML_writeline($xmlhash,"biblionumber",$biblionumber,"biblios");
+
+###NEU specific add cataloguers cardnumber as well
+
+my $me= C4::Context->userenv;
+my $cataloger=$me->{'cardnumber'} if ($me);
+$xmlhash=XML_writeline($xmlhash,"indexedby",$cataloger,"biblios") if $cataloger;
+
+## We must add the indexing fields for LC in MARC record--TG
+&XMLmodLCindex($dbh,$xmlhash);
+
+##Find itemtype
+my $itemtype=XML_readline_onerecord($xmlhash,"itemtype","biblios");
+##Find ISBN
+my $isbn=XML_readline_onerecord($xmlhash,"isbn","biblios");
+##Find ISSN
+my $issn=XML_readline_onerecord($xmlhash,"issn","biblios");
+##Find Title
+my $title=XML_readline_onerecord($xmlhash,"title","biblios");
+##Find Author
+my $author=XML_readline_onerecord($xmlhash,"title","biblios");
+my $xml=XML_hash2xml($xmlhash);
+
+ $sth = $dbh->prepare("insert into biblio set biblionumber = ?,frameworkcode=?, itemtype=?,marcxml=?,title=?,author=?,isbn=?,issn=?" );
+ $sth->execute( $biblionumber,$frameworkcode, $itemtype,$xml ,$title,$author,$isbn,$issn );
-sub NEWnewbiblio {
- my ( $dbh, $record, $frameworkcode ) = @_;
- my $biblionumber;
- my $biblioitemnumber;
- my $olddata = MARCmarc2koha( $dbh, $record,$frameworkcode );
- $olddata->{frameworkcode} = $frameworkcode;
- $biblionumber = OLDnewbiblio( $dbh, $olddata );
- $olddata->{biblionumber} = $biblionumber;
- # add biblionumber into the MARC record (it's the ID for zebra)
- my ( $tagfield, $tagsubfield ) =
- MARCfind_marc_from_kohafield( $dbh, "biblio.biblionumber",$frameworkcode );
- # create the field
- my $newfield;
- if ($tagfield<10) {
- $newfield = MARC::Field->new(
- $tagfield, $biblionumber,
- );
- } else {
- $newfield = MARC::Field->new(
- $tagfield, '', '', "$tagsubfield" => $biblionumber,
- );
- }
- # drop old field (just in case it already exist and create new one...
- my $old_field = $record->field($tagfield);
- $record->delete_field($old_field);
- $record->add_fields($newfield);
-
- #create the marc entry, that stores the rax marc record in Koha 3.0
- $olddata->{marc} = $record->as_usmarc();
- $olddata->{marcxml} = $record->as_xml();
- # and create biblioitem, that's all folks !
- $biblioitemnumber = OLDnewbiblioitem( $dbh, $olddata );
-
- # search subtiles, addiauthors and subjects
- ( $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] );
- }
- }
- ( $tagfield, $tagsubfield ) =
- MARCfind_marc_from_kohafield( $dbh, "bibliosubtitle.subtitle",$frameworkcode );
- my @subtitlefields = $record->field($tagfield);
- foreach my $subtitlefield (@subtitlefields) {
- my @subtitlesubfields = $subtitlefield->subfield($tagsubfield);
- foreach my $subfieldcount ( 0 .. $#subtitlesubfields ) {
- OLDnewsubtitle( $dbh, $biblionumber,
- $subtitlesubfields[$subfieldcount] );
- }
- }
- ( $tagfield, $tagsubfield ) =
- MARCfind_marc_from_kohafield( $dbh, "bibliosubject.subject",$frameworkcode );
- my @subj = $record->field($tagfield);
- my @subjects;
- foreach my $subject (@subj) {
- my @subjsubfield = $subject->subfield($tagsubfield);
- foreach my $subfieldcount ( 0 .. $#subjsubfield ) {
- push @subjects, $subjsubfield[$subfieldcount];
- }
- }
- OLDmodsubject( $dbh, $biblionumber, 1, @subjects );
- return ( $biblionumber, $biblioitemnumber );
+ $sth->finish;
+### Do not add biblio to ZEBRA unless there is an item with it -- depends on system preference defaults to NO
+if (C4::Context->preference('AddaloneBiblios')){
+ ZEBRAop($dbh,$biblionumber,"specialUpdate","biblioserver");
}
-
-sub NEWmodbiblioframework {
- my ($dbh,$bibid,$frameworkcode) =@_;
- my $sth = $dbh->prepare("Update marc_biblio SET frameworkcode=? WHERE bibid=$bibid");
- $sth->execute($frameworkcode);
- return 1;
+ return ($biblionumber);
}
sub NEWmodbiblio {
- my ($dbh,$record,$biblionumber,$frameworkcode) =@_;
- $frameworkcode="" unless $frameworkcode;
-# &MARCmodbiblio($dbh,$bibid,$record,$frameworkcode,0);
- my $oldbiblio = MARCmarc2koha($dbh,$record,$frameworkcode);
-
- $oldbiblio->{frameworkcode} = $frameworkcode;
- #create the marc entry, that stores the rax marc record in Koha 3.0
- $oldbiblio->{marc} = $record->as_usmarc();
- $oldbiblio->{marcxml} = $record->as_xml();
-
- OLDmodbiblio($dbh,$oldbiblio);
- OLDmodbibitem($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]);
- }
- }
- ($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
- # 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);
- }
- }
- }
- ($tagfield,$tagsubfield) = MARCfind_marc_from_kohafield($dbh,"bibliosubject.subject",$frameworkcode);
- my @subj = $record->field($tagfield);
- my @subjects;
- foreach my $subject (@subj) {
- my @subjsubfield = $subject->subfield($tagsubfield);
- foreach my $subfieldcount (0..$#subjsubfield) {
- push @subjects,$subjsubfield[$subfieldcount];
- }
- }
- OLDmodsubject($dbh,$biblionumber,1,@subjects);
- return 1;
-}
+ my ( $dbh, $biblionumber,$xmlhash,$frameworkcode ) = @_;
+##Add biblionumber incase lost on html
-sub NEWdelbiblio {
- my ( $dbh, $bibid ) = @_;
- my $biblio = &MARCfind_oldbiblionumber_from_MARCbibid( $dbh, $bibid );
- &OLDdelbiblio( $dbh, $biblio );
- my $sth =
- $dbh->prepare(
- "select biblioitemnumber from biblioitems where biblionumber=?");
- $sth->execute($biblio);
- while ( my ($biblioitemnumber) = $sth->fetchrow ) {
- OLDdeletebiblioitem( $dbh, $biblioitemnumber );
- }
- &MARCdelbiblio( $dbh, $bibid, 0 );
-}
+$xmlhash=XML_writeline($xmlhash,"biblionumber",$biblionumber,"biblios");
-sub NEWnewitem {
- my ( $dbh, $record, $biblionumber, $biblioitemnumber ) = @_;
+###NEU specific add cataloguers cardnumber as well
+my $me= C4::Context->userenv;
+my $cataloger=$me->{'cardnumber'} if ($me);
- # add item in old-DB
- my $frameworkcode=MARCfind_frameworkcode($dbh,$biblionumber);
- my $item = &MARCmarc2koha( $dbh, $record,$frameworkcode );
- # needs old biblionumber and biblioitemnumber
- $item->{'biblionumber'} = $biblionumber;
- $item->{'biblioitemnumber'}=$biblioitemnumber;
- $item->{marc} = $record->as_usmarc();
- my ( $itemnumber, $error ) = &OLDnewitems( $dbh, $item, $item->{barcode} );
- return $itemnumber;
-}
+$xmlhash=XML_writeline($xmlhash,"indexedby",$cataloger,"biblios") if $cataloger;
-sub NEWmoditem {
- my ( $dbh, $record, $biblionumber, $biblioitemnumber, $itemnumber, $delete ) = @_;
-
-# &MARCmoditem( $dbh, $record, $bibid, $itemnumber, $delete );
- my $frameworkcode=MARCfind_frameworkcode($dbh,$biblionumber);
- my $olditem = MARCmarc2koha( $dbh, $record,$frameworkcode );
- # add MARC record
- $olditem->{marc} = $record->as_usmarc();
- $olditem->{biblionumber} = $biblionumber;
- $olditem->{biblioitemnumber} = $biblioitemnumber;
- # and modify item
- OLDmoditem( $dbh, $olditem );
-}
+## We must add the indexing fields for LC in MARC record--TG
-sub NEWdelitem {
- my ( $dbh, $bibid, $itemnumber ) = @_;
- my $biblio = &MARCfind_oldbiblionumber_from_MARCbibid( $dbh, $bibid );
- &OLDdelitem( $dbh, $itemnumber );
- &MARCdelitem( $dbh, $bibid, $itemnumber );
+ XMLmodLCindex($dbh,$xmlhash);
+ OLDmodbiblio ($dbh,$xmlhash,$biblionumber,$frameworkcode);
+ my $ok=ZEBRAop($dbh,$biblionumber,"specialUpdate","biblioserver");
+ return ($biblionumber);
}
#
#
#
-=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)
-
-=item OLDnewsubject($dbh,$bibnum);
-
-adds a subject
-
-=item OLDnewsubtitle($dbh,$bibnum,$subtitle);
-
-create a new subtitle
-
-=item ($itemnumber,$errors)= OLDnewitems($dbh,$item,$barcode);
-
-create a item. $item is a hash and $barcode the barcode.
-
-=item OLDmoditem($dbh,$item);
-
-modify item
-
-=item OLDdelitem($dbh,$itemnum);
-
-delete item
-
-=item OLDdeletebiblioitem($dbh,$biblioitemnumber);
-
-deletes a biblioitem
-NOTE : not standard sub name. Should be OLDdelbiblioitem()
-
-=item OLDdelbiblio($dbh,$biblio);
-
-delete a biblio
-
-=cut
-
-sub OLDnewbiblio {
- my ( $dbh, $biblio ) = @_;
-
- $dbh->do('lock tables biblio WRITE');
- my $sth = $dbh->prepare("Select max(biblionumber) from biblio");
- $sth->execute;
- my $data = $sth->fetchrow_arrayref;
- my $bibnum = $$data[0] + 1;
- my $series = 0;
-
- if ( $biblio->{'seriestitle'} ) { $series = 1 }
- $sth->finish;
- $sth =
- $dbh->prepare("insert into biblio set biblionumber=?, title=?, author=?, copyrightdate=?,
- serial=?, seriestitle=?, notes=?, abstract=?,
- unititle=?"
- );
- $sth->execute(
- $bibnum, $biblio->{'title'},
- $biblio->{'author'}, $biblio->{'copyrightdate'},
- $biblio->{'serial'}, $biblio->{'seriestitle'},
- $biblio->{'notes'}, $biblio->{'abstract'},
- $biblio->{'unititle'}
- );
-
- $sth->finish;
- $dbh->do('unlock tables');
- return ($bibnum);
-}
-
-sub OLDmodbiblio {
- my ( $dbh, $biblio ) = @_;
- my $sth = $dbh->prepare("Update biblio set title=?, author=?, abstract=?, copyrightdate=?,
- seriestitle=?, serial=?, unititle=?, notes=?, frameworkcode=?
- where biblionumber = ?"
- );
- $sth->execute(
- $biblio->{'title'}, $biblio->{'author'},
- $biblio->{'abstract'}, $biblio->{'copyrightdate'},
- $biblio->{'seriestitle'}, $biblio->{'serial'},
- $biblio->{'unititle'}, $biblio->{'notes'},
- $biblio->{frameworkcode},
- $biblio->{'biblionumber'}
- );
- $sth->finish;
- return ( $biblio->{'biblionumber'} );
-} # sub modbiblio
-
-sub OLDmodsubtitle {
- my ( $dbh, $bibnum, $subtitle ) = @_;
- my $sth =
- $dbh->prepare(
- "update bibliosubtitle set subtitle = ? where biblionumber = ?");
- $sth->execute( $subtitle, $bibnum );
- $sth->finish;
-} # sub modsubtitle
-
-sub OLDmodaddauthor {
- my ( $dbh, $bibnum, @authors ) = @_;
-
- # my $dbh = C4Connect;
- my $sth =
- $dbh->prepare("Delete from additionalauthors where biblionumber = ?");
-
- $sth->execute($bibnum);
- $sth->finish;
- foreach my $author (@authors) {
- if ( $author ne '' ) {
- $sth =
- $dbh->prepare(
- "Insert into additionalauthors set author = ?, biblionumber = ?"
- );
-
- $sth->execute( $author, $bibnum );
-
- $sth->finish;
- } # if
- }
-} # sub modaddauthor
-
-sub OLDmodsubject {
- my ( $dbh, $bibnum, $force, @subject ) = @_;
-
- # my $dbh = C4Connect;
- my $count = @subject;
- my $error;
- for ( my $i = 0 ; $i < $count ; $i++ ) {
- $subject[$i] =~ s/^ //g;
- $subject[$i] =~ s/ $//g;
- my $sth =
- $dbh->prepare(
-"select * from catalogueentry where entrytype = 's' and catalogueentry = ?"
- );
- $sth->execute( $subject[$i] );
-
- if ( my $data = $sth->fetchrow_hashref ) {
- }
- else {
- if ( $force eq $subject[$i] || $force == 1 ) {
-
- # subject not in aut, chosen to force anway
- # so insert into cataloguentry so its in auth file
- my $sth2 =
- $dbh->prepare(
-"Insert into catalogueentry (entrytype,catalogueentry) values ('s',?)"
- );
-
- $sth2->execute( $subject[$i] ) if ( $subject[$i] );
- $sth2->finish;
- }
- else {
- $error =
- "$subject[$i]\n does not exist in the subject authority file";
- my $sth2 =
- $dbh->prepare(
-"Select * from catalogueentry where entrytype = 's' and (catalogueentry like ? or catalogueentry like ? or catalogueentry like ?)"
- );
- $sth2->execute( "$subject[$i] %", "% $subject[$i] %",
- "% $subject[$i]" );
- while ( my $data = $sth2->fetchrow_hashref ) {
- $error .= "<br>$data->{'catalogueentry'}";
- } # while
- $sth2->finish;
- } # else
- } # else
- $sth->finish;
- } # else
- if ( $error eq '' ) {
- my $sth =
- $dbh->prepare("Delete from bibliosubject where biblionumber = ?");
- $sth->execute($bibnum);
- $sth->finish;
- $sth =
- $dbh->prepare(
- "Insert into bibliosubject (subject,biblionumber) values (?,?)");
- my $query;
- foreach $query (@subject) {
- $sth->execute( $query, $bibnum ) if ( $query && $bibnum );
- } # foreach
- $sth->finish;
- } # if
-
- # $dbh->disconnect;
- return ($error);
-} # sub modsubject
-
-sub OLDmodbibitem {
- my ( $dbh, $biblioitem ) = @_;
- my $query;
-
- my $sth = $dbh->prepare("update biblioitems set itemtype=?, url=?, isbn=?, issn=?,
- publishercode=?, publicationyear=?, classification=?, dewey=?,
- subclass=?, illus=?, pages=?, volumeddesc=?,
- notes=?, size=?, place=?, marc=?,
- marcxml=?
- where biblioitemnumber=?");
- $sth->execute( $biblioitem->{itemtype}, $biblioitem->{url}, $biblioitem->{isbn}, $biblioitem->{issn},
- $biblioitem->{publishercode}, $biblioitem->{publicationyear}, $biblioitem->{classification}, $biblioitem->{dewey},
- $biblioitem->{subclass}, $biblioitem->{illus}, $biblioitem->{pages}, $biblioitem->{volumeddesc},
- $biblioitem->{bnotes}, $biblioitem->{size}, $biblioitem->{place}, $biblioitem->{marc},
- $biblioitem->{marcxml}, $biblioitem->{biblioitemnumber});
-# warn "MOD : $biblioitem->{biblioitemnumber} = ".$biblioitem->{marc};
-} # sub modbibitem
-
-sub OLDmodnote {
- my ( $dbh, $bibitemnum, $note ) = @_;
-
- # my $dbh=C4Connect;
- my $query = "update biblioitems set notes='$note' where
- biblioitemnumber='$bibitemnum'";
- my $sth = $dbh->prepare($query);
- $sth->execute;
- $sth->finish;
-
- # $dbh->disconnect;
-}
-
-sub OLDnewbiblioitem {
- my ( $dbh, $biblioitem ) = @_;
-
- $dbh->do("lock tables biblioitems WRITE, biblio WRITE");
- my $sth = $dbh->prepare("Select max(biblioitemnumber) from biblioitems");
- my $data;
- my $biblioitemnumber;
-
- $sth->execute;
- $data = $sth->fetchrow_arrayref;
- $biblioitemnumber = $$data[0] + 1;
-
- # Insert biblioitemnumber in MARC record, we need it to manage items later...
- my $frameworkcode=MARCfind_frameworkcode($dbh,$biblioitem->{biblionumber});
- my ($biblioitemnumberfield,$biblioitemnumbersubfield) = MARCfind_marc_from_kohafield($dbh,'biblioitems.biblioitemnumber',$frameworkcode);
- my $record = MARC::File::USMARC::decode($biblioitem->{marc});
- my $field=$record->field($biblioitemnumberfield);
- $field->update($biblioitemnumbersubfield => "$biblioitemnumber");
- $biblioitem->{marc} = $record->as_usmarc();
- $biblioitem->{marcxml} = $record->as_xml();
-
- $sth = $dbh->prepare( "insert into biblioitems set
- biblioitemnumber = ?, biblionumber = ?,
- volume = ?, number = ?,
- classification = ?, itemtype = ?,
- url = ?, isbn = ?,
- issn = ?, dewey = ?,
- subclass = ?, publicationyear = ?,
- publishercode = ?, volumedate = ?,
- volumeddesc = ?, illus = ?,
- pages = ?, notes = ?,
- size = ?, lccn = ?,
- marc = ?, place = ?,
- marcxml = ?"
- );
- $sth->execute(
- $biblioitemnumber, $biblioitem->{'biblionumber'},
- $biblioitem->{'volume'}, $biblioitem->{'number'},
- $biblioitem->{'classification'}, $biblioitem->{'itemtype'},
- $biblioitem->{'url'}, $biblioitem->{'isbn'},
- $biblioitem->{'issn'}, $biblioitem->{'dewey'},
- $biblioitem->{'subclass'}, $biblioitem->{'publicationyear'},
- $biblioitem->{'publishercode'}, $biblioitem->{'volumedate'},
- $biblioitem->{'volumeddesc'}, $biblioitem->{'illus'},
- $biblioitem->{'pages'}, $biblioitem->{'bnotes'},
- $biblioitem->{'size'}, $biblioitem->{'lccn'},
- $biblioitem->{'marc'}, $biblioitem->{'place'},
- $biblioitem->{marcxml},
- );
- $dbh->do("unlock tables");
- return ($biblioitemnumber);
-}
-
-sub OLDnewsubject {
- my ( $dbh, $bibnum ) = @_;
- my $sth =
- $dbh->prepare("insert into bibliosubject (biblionumber) values (?)");
- $sth->execute($bibnum);
- $sth->finish;
-}
-
-sub OLDnewsubtitle {
- my ( $dbh, $bibnum, $subtitle ) = @_;
- my $sth =
- $dbh->prepare(
- "insert into bibliosubtitle set biblionumber = ?, subtitle = ?");
- $sth->execute( $bibnum, $subtitle ) if $subtitle;
- $sth->finish;
-}
-
sub OLDnewitems {
- my ( $dbh, $item, $barcode ) = @_;
-# warn "OLDNEWITEMS";
-
- $dbh->do('lock tables items WRITE, biblio WRITE,biblioitems WRITE');
- my $sth = $dbh->prepare("Select max(itemnumber) from items");
+ my ( $dbh, $xmlhash) = @_;
+ my $sth = $dbh->prepare("SELECT max(itemnumber) from items");
my $data;
my $itemnumber;
- my $error = "";
$sth->execute;
$data = $sth->fetchrow_hashref;
$itemnumber = $data->{'max(itemnumber)'} + 1;
-
-# FIXME the "notforloan" field seems to be named "loan" in some places. workaround bugfix.
- if ( $item->{'loan'} ) {
- $item->{'notforloan'} = $item->{'loan'};
- }
-
- # if dateaccessioned is provided, use it. Otherwise, set to NOW()
- if ( $item->{'dateaccessioned'} ) {
- $sth = $dbh->prepare( "Insert into items set
- itemnumber = ?, biblionumber = ?,
- multivolumepart = ?,
- biblioitemnumber = ?, barcode = ?,
- booksellerid = ?, dateaccessioned = ?,
- homebranch = ?, holdingbranch = ?,
- price = ?, replacementprice = ?,
- replacementpricedate = NOW(), datelastseen = NOW(),
- multivolume = ?, stack = ?,
- itemlost = ?, wthdrawn = ?,
- paidfor = ?, itemnotes = ?,
- itemcallnumber =?, notforloan = ?,
- location = ?
- "
- );
- $sth->execute(
- $itemnumber, $item->{'biblionumber'},
- $item->{'multivolumepart'},
- $item->{'biblioitemnumber'},$barcode,
- $item->{'booksellerid'}, $item->{'dateaccessioned'},
- $item->{'homebranch'}, $item->{'holdingbranch'},
- $item->{'price'}, $item->{'replacementprice'},
- $item->{multivolume}, $item->{stack},
- $item->{itemlost}, $item->{wthdrawn},
- $item->{paidfor}, $item->{'itemnotes'},
- $item->{'itemcallnumber'}, $item->{'notforloan'},
- $item->{'location'}
- );
- if ( defined $sth->errstr ) {
- $error .= $sth->errstr;
- }
- }
- else {
- $sth = $dbh->prepare( "Insert into items set
- itemnumber = ?, biblionumber = ?,
- multivolumepart = ?,
- biblioitemnumber = ?, barcode = ?,
- booksellerid = ?, dateaccessioned = NOW(),
- homebranch = ?, holdingbranch = ?,
- price = ?, replacementprice = ?,
- replacementpricedate = NOW(), datelastseen = NOW(),
- multivolume = ?, stack = ?,
- itemlost = ?, wthdrawn = ?,
- paidfor = ?, itemnotes = ?,
- itemcallnumber =?, notforloan = ?,
- location = ?
- "
- );
- $sth->execute(
- $itemnumber, $item->{'biblionumber'},
- $item->{'multivolumepart'},
- $item->{'biblioitemnumber'},$barcode,
- $item->{'booksellerid'},
- $item->{'homebranch'}, $item->{'holdingbranch'},
- $item->{'price'}, $item->{'replacementprice'},
- $item->{multivolume}, $item->{stack},
- $item->{itemlost}, $item->{wthdrawn},
- $item->{paidfor}, $item->{'itemnotes'},
- $item->{'itemcallnumber'}, $item->{'notforloan'},
- $item->{'location'}
- );
- if ( defined $sth->errstr ) {
- $error .= $sth->errstr;
- }
- }
- # item stored, now, deal with the marc part...
- $sth = $dbh->prepare("select biblioitems.marc,biblio.frameworkcode from biblioitems,biblio
- where biblio.biblionumber=biblioitems.biblionumber and
- biblio.biblionumber=?");
- $sth->execute($item->{biblionumber});
- if ( defined $sth->errstr ) {
- $error .= $sth->errstr;
- }
- my ($rawmarc,$frameworkcode) = $sth->fetchrow;
- warn "ERROR IN OLDnewitem, MARC record not found FOR $item->{biblionumber} => $rawmarc <=" unless $rawmarc;
- my $record = MARC::File::USMARC::decode($rawmarc);
- # ok, we have the marc record, add item number to the item field (in {marc}, and add the field to the record)
- my ($itemnumberfield,$itemnumbersubfield) = MARCfind_marc_from_kohafield($dbh,'items.itemnumber',$frameworkcode);
- my $itemrecord = MARC::File::USMARC::decode($item->{marc});
- my $itemfield = $itemrecord->field($itemnumberfield);
- $itemfield->add_subfields($itemnumbersubfield => "$itemnumber");
- $record->insert_grouped_field($itemfield);
- # save the record into biblioitem
- $sth=$dbh->prepare("update biblioitems set marc=?,marcxml=? where biblionumber=?");
- $sth->execute($record->as_usmarc(),$record->as_xml(),$item->{biblionumber});
- if ( defined $sth->errstr ) {
- $error .= $sth->errstr;
- }
- $dbh->do('unlock tables');
- return ( $itemnumber, $error );
+ $sth->finish;
+ $xmlhash=XML_writeline( $xmlhash, "itemnumber", $itemnumber,"holdings" );
+my $biblionumber=XML_readline_onerecord($xmlhash,"biblionumber","holdings");
+ my $barcode=XML_readline_onerecord($xmlhash,"barcode","holdings");
+my $xml=XML_hash2xml($xmlhash);
+ $sth = $dbh->prepare( "Insert into items set itemnumber = ?, biblionumber = ?,barcode = ?,marcxml=?" );
+ $sth->execute($itemnumber,$biblionumber,$barcode,$xml);
+ return $itemnumber;
}
sub OLDmoditem {
- my ( $dbh, $item ) = @_;
- my $error;
- $dbh->do('lock tables items WRITE, biblio WRITE,biblioitems WRITE');
- $item->{'itemnum'} = $item->{'itemnumber'} unless $item->{'itemnum'};
- my $query = "update items set barcode=?,itemnotes=?,itemcallnumber=?,notforloan=?,location=?,multivolumepart=?,multivolume=?,stack=?,wthdrawn=?";
- my @bind = (
- $item->{'barcode'}, $item->{'notes'},
- $item->{'itemcallnumber'}, $item->{'notforloan'},
- $item->{'location'}, $item->{multivolumepart},
- $item->{multivolume}, $item->{stack},
- $item->{wthdrawn},
- );
- if ( $item->{'lost'} ne '' ) {
- $query = "update items set biblioitemnumber=?,barcode=?,itemnotes=?,homebranch=?,
- itemlost=?,wthdrawn=?,itemcallnumber=?,notforloan=?,
- location=?,multivolumepart=?,multivolume=?,stack=?,wthdrawn=?";
- @bind = (
- $item->{'bibitemnum'}, $item->{'barcode'},
- $item->{'notes'}, $item->{'homebranch'},
- $item->{'lost'}, $item->{'wthdrawn'},
- $item->{'itemcallnumber'}, $item->{'notforloan'},
- $item->{'location'}, $item->{multivolumepart},
- $item->{multivolume}, $item->{stack},
- $item->{wthdrawn},
- );
- if ($item->{homebranch}) {
- $query.=",homebranch=?";
- push @bind, $item->{homebranch};
- }
- if ($item->{holdingbranch}) {
- $query.=",holdingbranch=?";
- push @bind, $item->{holdingbranch};
- }
- }
- $query.=" where itemnumber=?";
- push @bind,$item->{'itemnum'};
- if ( $item->{'replacement'} ne '' ) {
- $query =~ s/ where/,replacementprice='$item->{'replacement'}' where/;
- }
- my $sth = $dbh->prepare($query);
- $sth->execute(@bind);
-
- # item stored, now, deal with the marc part...
- $sth = $dbh->prepare("select biblioitems.marc,biblio.frameworkcode from biblioitems,biblio
- where biblio.biblionumber=biblioitems.biblionumber and
- biblio.biblionumber=? and
- biblioitems.biblioitemnumber=?");
- $sth->execute($item->{biblionumber},$item->{biblioitemnumber});
- if ( defined $sth->errstr ) {
- $error .= $sth->errstr;
- }
- my ($rawmarc,$frameworkcode) = $sth->fetchrow;
- warn "ERROR IN OLDmoditem, 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);
- # prepare the new item record
- my $itemrecord = MARC::File::USMARC::decode($item->{marc});
- my $itemfield = $itemrecord->field($itemnumberfield);
- $itemfield->add_subfields($itemnumbersubfield => '$itemnumber');
- # parse all fields fields from the complete record
- foreach ($record->field($itemnumberfield)) {
- # when the previous field is found, replace by the new one
- if ($_->subfield($itemnumbersubfield) == $item->{itemnum}) {
- $_->replace_with($itemfield);
- }
- }
-# $record->insert_grouped_field($itemfield);
- # save the record into biblioitem
- $sth=$dbh->prepare("update biblioitems set marc=?,marcxml=? where biblionumber=? and biblioitemnumber=?");
- $sth->execute($record->as_usmarc(),$record->as_xml(),$item->{biblionumber},$item->{biblioitemnumber});
- if ( defined $sth->errstr ) {
- $error .= $sth->errstr;
- }
- $dbh->do('unlock tables');
-
- # $dbh->disconnect;
-}
-
-sub OLDdelitem {
- my ( $dbh, $itemnum ) = @_;
-
- # my $dbh=C4Connect;
- my $sth = $dbh->prepare("select * from items where itemnumber=?");
- $sth->execute($itemnum);
- my $data = $sth->fetchrow_hashref;
- $sth->finish;
- my $query = "Insert into deleteditems set ";
- my @bind = ();
- foreach my $temp ( keys %$data ) {
- $query .= "$temp = ?,";
- push ( @bind, $data->{$temp} );
- }
- $query =~ s/\,$//;
-
- # print $query;
- $sth = $dbh->prepare($query);
- $sth->execute(@bind);
- $sth->finish;
- $sth = $dbh->prepare("Delete from items where itemnumber=?");
- $sth->execute($itemnum);
+ my ( $dbh, $xml,$biblionumber,$itemnumber,$barcode ) = @_;
+ my $sth =$dbh->prepare("replace items set biblionumber=?,marcxml=?,barcode=? , itemnumber=?");
+ $sth->execute($biblionumber,$xml,$barcode,$itemnumber);
$sth->finish;
-
- # $dbh->disconnect;
}
-sub OLDdeletebiblioitem {
- my ( $dbh, $biblioitemnumber ) = @_;
-
- # my $dbh = C4Connect;
- my $sth = $dbh->prepare( "Select * from biblioitems
-where biblioitemnumber = ?"
- );
- my $results;
-
- $sth->execute($biblioitemnumber);
-
- if ( $results = $sth->fetchrow_hashref ) {
+sub OLDdelitem {
+ my ( $dbh, $itemnumber ) = @_;
+my $sth = $dbh->prepare("select * from items where itemnumber=?");
+ $sth->execute($itemnumber);
+ if ( my $data = $sth->fetchrow_hashref ) {
$sth->finish;
- $sth =
- $dbh->prepare(
-"Insert into deletedbiblioitems (biblioitemnumber, biblionumber, volume, number, classification, itemtype,
- isbn, issn ,dewey ,subclass ,publicationyear ,publishercode ,volumedate ,volumeddesc ,timestamp ,illus ,
- pages ,notes ,size ,url ,lccn ) values(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)"
- );
-
- $sth->execute(
- $results->{biblioitemnumber}, $results->{biblionumber},
- $results->{volume}, $results->{number},
- $results->{classification}, $results->{itemtype},
- $results->{isbn}, $results->{issn},
- $results->{dewey}, $results->{subclass},
- $results->{publicationyear}, $results->{publishercode},
- $results->{volumedate}, $results->{volumeddesc},
- $results->{timestamp}, $results->{illus},
- $results->{pages}, $results->{notes},
- $results->{size}, $results->{url},
- $results->{lccn}
- );
- my $sth2 =
- $dbh->prepare("Delete from biblioitems where biblioitemnumber = ?");
- $sth2->execute($biblioitemnumber);
- $sth2->finish();
- } # if
- $sth->finish;
-
- # Now delete all the items attached to the biblioitem
- $sth = $dbh->prepare("Select * from items where biblioitemnumber = ?");
- $sth->execute($biblioitemnumber);
- my @results;
- while ( my $data = $sth->fetchrow_hashref ) {
- my $query = "Insert into deleteditems set ";
+ my $query = "replace deleteditems set ";
my @bind = ();
foreach my $temp ( keys %$data ) {
$query .= "$temp = ?,";
push ( @bind, $data->{$temp} );
}
+
+ #replacing the last , by ",?)"
$query =~ s/\,$//;
- my $sth2 = $dbh->prepare($query);
- $sth2->execute(@bind);
- } # while
+ $sth = $dbh->prepare($query);
+ $sth->execute(@bind);
+ $sth->finish;
+ $sth = $dbh->prepare("Delete from items where itemnumber=?");
+ $sth->execute($itemnumber);
$sth->finish;
- $sth = $dbh->prepare("Delete from items where biblioitemnumber = ?");
- $sth->execute($biblioitemnumber);
- $sth->finish();
+ }
+ $sth->finish;
+}
- # $dbh->disconnect;
-} # sub deletebiblioitem
+sub OLDmodbiblio {
+# modifies the biblio table
+my ($dbh,$xmlhash,$biblionumber,$frameworkcode) = @_;
+ if (!$frameworkcode){
+ $frameworkcode="";
+ }
+##Find itemtype
+my $itemtype=XML_readline_onerecord($xmlhash,"itemtype","biblios");
+##Find ISBN
+my $isbn=XML_readline_onerecord($xmlhash,"isbn","biblios");
+##Find ISSN
+my $issn=XML_readline_onerecord($xmlhash,"issn","biblios");
+##Find Title
+my $title=XML_readline_onerecord($xmlhash,"title","biblios");
+##Find Author
+my $author=XML_readline_onerecord($xmlhash,"author","biblios");
+my $xml=XML_hash2xml($xmlhash);
+
+$isbn=~ s/(\.|\?|\;|\=|\-|\/|\\|\||\:|\*|\!|\,|\(|\)|\[|\]|\{|\}|\/)//g;
+$issn=~ s/(\.|\?|\;|\=|\-|\/|\\|\||\:|\*|\!|\,|\(|\)|\[|\]|\{|\}|\/)//g;
+$isbn=~s/^\s+|\s+$//g;
+$isbn=substr($isbn,0,13);
+ my $sth = $dbh->prepare("REPLACE biblio set biblionumber=?,marcxml=?,frameworkcode=? ,itemtype=? , title=?,author=?,isbn=?,issn=?" );
+ $sth->execute( $biblionumber ,$xml, $frameworkcode,$itemtype, $title,$author,$isbn,$issn);
+ $sth->finish;
+ return $biblionumber;
+}
sub OLDdelbiblio {
- my ( $dbh, $biblio ) = @_;
+ my ( $dbh, $biblionumber ) = @_;
my $sth = $dbh->prepare("select * from biblio where biblionumber=?");
- $sth->execute($biblio);
+ $sth->execute($biblionumber);
if ( my $data = $sth->fetchrow_hashref ) {
$sth->finish;
- my $query = "Insert into deletedbiblio set ";
+ my $query = "replace deletedbiblio set ";
my @bind = ();
- foreach my $temp ( keys %$data ) {
+ foreach my $temp ( keys %$data ) {
$query .= "$temp = ?,";
push ( @bind, $data->{$temp} );
- }
+ }
#replacing the last , by ",?)"
$query =~ s/\,$//;
$sth->execute(@bind);
$sth->finish;
$sth = $dbh->prepare("Delete from biblio where biblionumber=?");
- $sth->execute($biblio);
+ $sth->execute($biblionumber);
$sth->finish;
}
$sth->finish;
}
+
+#
#
#
-# old functions
+#ZEBRA ZEBRA ZEBRA
#
#
-sub itemcount {
- my ($biblio) = @_;
- my $dbh = C4::Context->dbh;
+sub ZEBRAdelbiblio {
+## Zebra calls this routine to delete after it deletes biblio from ZEBRAddb
+ my ( $dbh, $biblionumber ) = @_;
+my $sth=$dbh->prepare("SELECT itemnumber FROM items where biblionumber=?");
- # print $query;
- my $sth = $dbh->prepare("Select count(*) from items where biblionumber=?");
- $sth->execute($biblio);
- my $data = $sth->fetchrow_hashref;
- $sth->finish;
- return ( $data->{'count(*)'} );
+$sth->execute($biblionumber);
+ while (my $itemnumber =$sth->fetchrow){
+ OLDdelitem($dbh,$itemnumber) ;
+ }
+OLDdelbiblio($dbh,$biblionumber) ;
}
-sub newbiblio {
- my ($biblio) = @_;
- my $dbh = C4::Context->dbh;
- my $bibnum = OLDnewbiblio( $dbh, $biblio );
- # finds new (MARC bibid
- # my $bibid = &MARCfind_MARCbibid_from_oldbiblionumber($dbh,$bibnum);
- my $record = &MARCkoha2marcBiblio( $dbh, $bibnum );
- MARCaddbiblio( $dbh, $record, $bibnum,'' );
- return ($bibnum);
+sub ZEBRAgetrecord{
+my $biblionumber=shift;
+my @kohafield="biblionumber";
+my @value=$biblionumber;
+my ($count,@result)=C4::Search::ZEBRAsearch_kohafields(\@kohafield,\@value);
+
+ if ($count>0){
+ my ( $xmlrecord, @itemsrecord) = XML_separate($result[0]);
+ return ($xmlrecord, @itemsrecord);
+ }else{
+ return (undef,undef);
+ }
}
-=item modbiblio
-
- $biblionumber = &modbiblio($biblio);
-
-Update a biblio record.
-
-C<$biblio> is a reference-to-hash whose keys are the fields in the
-biblio table in the Koha database. All fields must be present, not
-just the ones you wish to change.
-
-C<&modbiblio> updates the record defined by
-C<$biblio-E<gt>{biblionumber}> with the values in C<$biblio>.
-
-C<&modbiblio> returns C<$biblio-E<gt>{biblionumber}> whether it was
-successful or not.
-
-=cut
-
-sub modbiblio {
- my ($biblio) = @_;
- my $dbh = C4::Context->dbh;
- my $biblionumber=OLDmodbiblio($dbh,$biblio);
- my $record = MARCkoha2marcBiblio($dbh,$biblionumber,$biblionumber);
- # finds new (MARC bibid
- my $bibid = &MARCfind_MARCbibid_from_oldbiblionumber($dbh,$biblionumber);
- MARCmodbiblio($dbh,$bibid,$record,"",0);
- return($biblionumber);
-} # sub modbiblio
-
-=item modsubtitle
-
- &modsubtitle($biblionumber, $subtitle);
-
-Sets the subtitle of a book.
-
-C<$biblionumber> is the biblionumber of the book to modify.
-
-C<$subtitle> is the new subtitle.
-
-=cut
-
-sub modsubtitle {
- my ( $bibnum, $subtitle ) = @_;
- my $dbh = C4::Context->dbh;
- &OLDmodsubtitle( $dbh, $bibnum, $subtitle );
-} # sub modsubtitle
-
-=item modaddauthor
-
- &modaddauthor($biblionumber, $author);
-
-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.
-
-=cut
-
-sub modaddauthor {
- my ( $bibnum, @authors ) = @_;
- my $dbh = C4::Context->dbh;
- &OLDmodaddauthor( $dbh, $bibnum, @authors );
-} # sub modaddauthor
-
-=item modsubject
-
- $error = &modsubject($biblionumber, $force, @subjects);
-
-$force - a subject to force
-
-$error - Error message, or undef if successful.
-
-=cut
+sub ZEBRAop {
+### Puts the zebra update in queue writes in zebraserver table
+my ($dbh,$biblionumber,$op,$server)=@_;
+if (!$biblionumber){
+warn "Zebra received no biblionumber";
+}else{
+my $sth=$dbh->prepare("insert into zebraqueue (biblio_auth_number ,server,operation) values(?,?,?)");
+$sth->execute($biblionumber,$server,$op);
+}
+}
-sub modsubject {
- my ( $bibnum, $force, @subject ) = @_;
- my $dbh = C4::Context->dbh;
- my $error = &OLDmodsubject( $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.
- # This check is to ensure that no MARC data exists to lose.
- if (C4::Context->preference("MARC") eq '0'){
- my $MARCRecord = &MARCkoha2marcBiblio($dbh,$bibnum);
- my $bibid = &MARCfind_MARCbibid_from_oldbiblionumber($dbh,$bibnum);
- &MARCmodbiblio($dbh,$bibid, $MARCRecord);
- }
+sub ZEBRAopserver{
+
+###Accepts a $server variable thus we can use it to update biblios, authorities or other zebra dbs
+my ($record,$op,$server,$biblionumber)=@_;
+
+my @port;
+
+my $tried=0;
+my $recon=0;
+my $reconnect=0;
+$record=Encode::encode("UTF-8",$record);
+my $shadow=$server."shadow";
+reconnect:
+
+ my $Zconnbiblio=C4::Context->Zconnauth($server);
+if ($record){
+my $Zpackage = $Zconnbiblio->package();
+$Zpackage->option(action => $op);
+ $Zpackage->option(record => $record);
+ $Zpackage->option(recordIdOpaque => $biblionumber);
+retry:
+ $Zpackage->send("update");
+
+ my($error, $errmsg, $addinfo, $diagset) = $Zconnbiblio->error_x();
+ if ($error==10007 && $tried<3) {## timeout --another 30 looonng seconds for this update
+ sleep 1; ## wait a sec!
+ $tried=$tried+1;
+ goto "retry";
+ }elsif ($error==2 && $tried<2) {## timeout --temporary zebra error !whatever that means
+ sleep 2; ## wait two seconds!
+ $tried=$tried+1;
+ goto "retry";
+ }elsif($error==10004 && $recon==0){##Lost connection -reconnect
+ sleep 1; ## wait a sec!
+ $recon=1;
+ $Zpackage->destroy();
+ $Zconnbiblio->destroy();
+ goto "reconnect";
+ }elsif ($error){
+ # warn "Error-$server $op /errcode:, $error, /MSG:,$errmsg,$addinfo \n";
+ $Zpackage->destroy();
+ $Zconnbiblio->destroy();
+ return 0;
}
- return ($error);
-} # sub modsubject
+
+$Zpackage->destroy();
+$Zconnbiblio->destroy();
+return 1;
+}
+return 0;
+}
-sub modbibitem {
- my ($biblioitem) = @_;
- my $dbh = C4::Context->dbh;
- &OLDmodbibitem( $dbh, $biblioitem );
-} # sub modbibitem
-sub modnote {
- my ( $bibitemnum, $note ) = @_;
- my $dbh = C4::Context->dbh;
- &OLDmodnote( $dbh, $bibitemnum, $note );
-}
+sub ZEBRAopcommit {
+my $server=shift;
-sub newbiblioitem {
- my ($biblioitem) = @_;
- my $dbh = C4::Context->dbh;
- my $bibitemnum = &OLDnewbiblioitem( $dbh, $biblioitem );
+my $Zconnbiblio=C4::Context->Zconnauth($server);
- my $MARCbiblio =
- MARCkoha2marcBiblio( $dbh, 0, $bibitemnum )
- ; # the 0 means "do NOT retrieve biblio, only biblioitem, in the MARC record
- my $bibid =
- &MARCfind_MARCbibid_from_oldbiblionumber( $dbh,
- $biblioitem->{biblionumber} );
- &MARCaddbiblio( $dbh, $MARCbiblio, $biblioitem->{biblionumber}, '',$bibid );
- return ($bibitemnum);
+my $Zpackage = $Zconnbiblio->package();
+ $Zpackage->send('commit');
+
+ my($error, $errmsg, $addinfo, $diagset) = $Zconnbiblio->error_x();
+ if ($error) { ## This is serious ZEBRA server is not updating
+ $Zpackage->destroy();
+ $Zconnbiblio->destroy();
+ return 0;
+ }
+$Zpackage->destroy();
+$Zconnbiblio->destroy();
+return 1;
+}
+sub ZEBRA_readyXML{
+my ($dbh,$biblionumber)=@_;
+my $biblioxml=XMLgetbiblio($dbh,$biblionumber);
+my @itemxml=XMLgetallitems($dbh,$biblionumber);
+my $zebraxml=collection_header();
+$zebraxml.="<koharecord>";
+$zebraxml.=$biblioxml;
+$zebraxml.="<holdings>";
+ foreach my $item(@itemxml){
+ $zebraxml.=$item if $item;
+ }
+$zebraxml.="</holdings>";
+$zebraxml.="</koharecord>";
+$zebraxml.="</kohacollection>";
+return $zebraxml;
}
-sub newsubject {
- my ($bibnum) = @_;
- my $dbh = C4::Context->dbh;
- &OLDnewsubject( $dbh, $bibnum );
+sub ZEBRA_readyXML_noheader{
+my ($dbh,$biblionumber)=@_;
+my $biblioxml=XMLgetbiblio($dbh,$biblionumber);
+my @itemxml=XMLgetallitems($dbh,$biblionumber);
+my $zebraxml="<koharecord>";
+$zebraxml.=$biblioxml;
+$zebraxml.="<holdings>";
+ foreach my $item(@itemxml){
+ $zebraxml.=$item if $item;
+ }
+$zebraxml.="</holdings>";
+$zebraxml.="</koharecord>";
+return $zebraxml;
}
-sub newsubtitle {
- my ( $bibnum, $subtitle ) = @_;
- my $dbh = C4::Context->dbh;
- &OLDnewsubtitle( $dbh, $bibnum, $subtitle );
+#
+#
+# various utility subs and those not complying to new rules
+#
+#
+
+sub newbiblio {
+## Used in acqui management -- creates the biblio from koha hash
+ my ($biblio) = @_;
+ my $dbh = C4::Context->dbh;
+my $record=XMLkoha2marc($dbh,$biblio,"biblios");
+ my $biblionumber=NEWnewbiblio($dbh,$record);
+ return ($biblionumber);
+}
+sub modbiblio {
+## Used in acqui management -- modifies the biblio from koha hash rather than xml-hash
+ my ($biblio) = @_;
+ my $dbh = C4::Context->dbh;
+my $record=XMLkoha2marc($dbh,$biblio,"biblios");
+ my $biblionumber=NEWmodbiblio($dbh,$record,$biblio->{biblionumber});
+ return ($biblionumber);
}
sub newitems {
+## Used in acqui management -- creates the item from hash rather than marc-record
my ( $item, @barcodes ) = @_;
my $dbh = C4::Context->dbh;
my $errors;
my $itemnumber;
my $error;
foreach my $barcode (@barcodes) {
- ( $itemnumber, $error ) = &OLDnewitems( $dbh, $item, uc($barcode) );
- $errors .= $error;
- my $MARCitem =
- &MARCkoha2marcItem( $dbh, $item->{biblionumber}, $itemnumber );
- &MARCadditem( $dbh, $MARCitem, $item->{biblionumber} );
- }
- return ($errors);
-}
-
-sub moditem {
- my ($item) = @_;
- my $dbh = C4::Context->dbh;
- &OLDmoditem( $dbh, $item );
- my $MARCitem =
- &MARCkoha2marcItem( $dbh, $item->{'biblionumber'}, $item->{'itemnum'} );
- my $bibid =
- &MARCfind_MARCbibid_from_oldbiblionumber( $dbh, $item->{biblionumber} );
- &MARCmoditem( $dbh, $MARCitem, $bibid, $item->{itemnum}, 0 );
-}
-
-sub checkitems {
- my ( $count, @barcodes ) = @_;
- my $dbh = C4::Context->dbh;
- my $error;
- my $sth = $dbh->prepare("Select * from items where barcode=?");
- for ( my $i = 0 ; $i < $count ; $i++ ) {
- $barcodes[$i] = uc $barcodes[$i];
- $sth->execute( $barcodes[$i] );
- if ( my $data = $sth->fetchrow_hashref ) {
- $error .= " Duplicate Barcode: $barcodes[$i]";
- }
+ $item->{barcode}=$barcode;
+my $record=MARCkoha2marc($dbh,$item,"holdings");
+ my $itemnumber= NEWnewitem($dbh,$record,$item->{biblionumber});
+
}
- $sth->finish;
- 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(*)'} );
-}
-
-sub delitem {
- my ($itemnum) = @_;
- my $dbh = C4::Context->dbh;
- &OLDdelitem( $dbh, $itemnum );
-}
-
-sub deletebiblioitem {
- my ($biblioitemnumber) = @_;
- my $dbh = C4::Context->dbh;
- &OLDdeletebiblioitem( $dbh, $biblioitemnumber );
-} # sub deletebiblioitem
-
-sub delbiblio {
- my ($biblio) = @_;
- my $dbh = C4::Context->dbh;
- &OLDdelbiblio( $dbh, $biblio );
- my $bibid = &MARCfind_MARCbibid_from_oldbiblionumber( $dbh, $biblio );
- &MARCdelbiblio( $dbh, $bibid, 0 );
+ return $itemnumber ;
}
-sub getbiblio {
- my ($biblionumber) = @_;
- my $dbh = C4::Context->dbh;
- my $sth = $dbh->prepare("Select * from biblio where biblionumber = ?");
-
- # || die "Cannot prepare $query\n" . $dbh->errstr;
- my $count = 0;
- my @results;
-
- $sth->execute($biblionumber);
-
- # || die "Cannot execute $query\n" . $sth->errstr;
- while ( my $data = $sth->fetchrow_hashref ) {
- $results[$count] = $data;
- $count++;
- } # while
-
- $sth->finish;
- return ( $count, @results );
-} # sub getbiblio
-
-sub getbiblioitem {
- my ($biblioitemnum) = @_;
- my $dbh = C4::Context->dbh;
- my $sth = $dbh->prepare( "Select * from biblioitems where
-biblioitemnumber = ?"
- );
- my $count = 0;
- my @results;
-
- $sth->execute($biblioitemnum);
-
- while ( my $data = $sth->fetchrow_hashref ) {
- $results[$count] = $data;
- $count++;
- } # while
-
- $sth->finish;
- return ( $count, @results );
-} # sub getbiblioitem
-
-sub getbiblioitembybiblionumber {
- my ($biblionumber) = @_;
- my $dbh = C4::Context->dbh;
- my $sth = $dbh->prepare("Select * from biblioitems where biblionumber = ?");
- my $count = 0;
- my @results;
- $sth->execute($biblionumber);
- while ( my $data = $sth->fetchrow_hashref ) {
- $results[$count] = $data;
- $count++;
- } # while
-
- $sth->finish;
- return ( $count, @results );
-} # sub
sub getitemtypes {
my $dbh = C4::Context->dbh;
# || die "Cannot prepare $query" . $dbh->errstr;
my $count = 0;
my @results;
-
$sth->execute;
-
# || die "Cannot execute $query\n" . $sth->errstr;
while ( my $data = $sth->fetchrow_hashref ) {
$results[$count] = $data;
return ( $count, @results );
} # sub getitemtypes
-sub getitemsbybiblioitem {
- my ($biblioitemnum) = @_;
- my $dbh = C4::Context->dbh;
- my $sth = $dbh->prepare( "Select * from items, biblio where
-biblio.biblionumber = items.biblionumber and biblioitemnumber
-= ?"
- );
-
- # || die "Cannot prepare $query\n" . $dbh->errstr;
- my $count = 0;
- my @results;
-
- $sth->execute($biblioitemnum);
- # || die "Cannot execute $query\n" . $sth->errstr;
- while ( my $data = $sth->fetchrow_hashref ) {
- $results[$count] = $data;
- $count++;
- } # while
- $sth->finish;
- 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";
- }
+sub getkohafields{
+#returns MySQL like fieldnames to emulate searches on sql like fieldnames
+my $type=shift;
+## Either opac or intranet to select appropriate fields
+## Assumes intranet
+$type="intra" unless $type;
+if ($type eq "intranet"){ $type="intra";}
+my $dbh = C4::Context->dbh;
+ my $i=0;
+my @results;
+$type=$type."show";
+my $sth=$dbh->prepare("SELECT * FROM koha_attr where $type=1 order by label");
+$sth->execute();
+while (my $data=$sth->fetchrow_hashref){
+ $results[$i]=$data;
+ $i++;
+ }
+$sth->finish;
+return ($i,@results);
}
-#------------------------------------------------
-#---------------------------------------
-# 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
- # sloppy code : should be improved in next issue
- my ( $string, $encoding ) = @_;
- $_ = $string;
-
- # $encoding = C4::Context->preference("marcflavour") unless $encoding;
- if ( $encoding eq "UNIMARC" ) {
-# s/\xe1/Æ/gm;
- s/\xe2/Ð/gm;
- s/\xe9/Ø/gm;
- s/\xec/þ/gm;
- s/\xf1/æ/gm;
- s/\xf3/ð/gm;
- s/\xf9/ø/gm;
- s/\xfb/ß/gm;
- s/\xc1\x61/à/gm;
- s/\xc1\x65/è/gm;
- s/\xc1\x69/ì/gm;
- s/\xc1\x6f/ò/gm;
- s/\xc1\x75/ù/gm;
- s/\xc1\x41/À/gm;
- s/\xc1\x45/È/gm;
- s/\xc1\x49/Ì/gm;
- s/\xc1\x4f/Ò/gm;
- s/\xc1\x55/Ù/gm;
- s/\xc2\x41/Á/gm;
- s/\xc2\x45/É/gm;
- s/\xc2\x49/Í/gm;
- s/\xc2\x4f/Ó/gm;
- s/\xc2\x55/Ú/gm;
- s/\xc2\x59/Ý/gm;
- s/\xc2\x61/á/gm;
- s/\xc2\x65/é/gm;
- s/\xc2\x69/í/gm;
- s/\xc2\x6f/ó/gm;
- s/\xc2\x75/ú/gm;
- s/\xc2\x79/ý/gm;
- s/\xc3\x41/Â/gm;
- s/\xc3\x45/Ê/gm;
- s/\xc3\x49/Î/gm;
- s/\xc3\x4f/Ô/gm;
- s/\xc3\x55/Û/gm;
- s/\xc3\x61/â/gm;
- s/\xc3\x65/ê/gm;
- s/\xc3\x69/î/gm;
- s/\xc3\x6f/ô/gm;
- s/\xc3\x75/û/gm;
- s/\xc4\x41/Ã/gm;
- s/\xc4\x4e/Ñ/gm;
- s/\xc4\x4f/Õ/gm;
- s/\xc4\x61/ã/gm;
- s/\xc4\x6e/ñ/gm;
- s/\xc4\x6f/õ/gm;
- s/\xc8\x41/Ä/gm;
- s/\xc8\x45/Ë/gm;
- s/\xc8\x49/Ï/gm;
- s/\xc8\x61/ä/gm;
- s/\xc8\x65/ë/gm;
- s/\xc8\x69/ï/gm;
- s/\xc8\x6F/ö/gm;
- s/\xc8\x75/ü/gm;
- s/\xc8\x76/ÿ/gm;
- s/\xc9\x41/Ä/gm;
- s/\xc9\x45/Ë/gm;
- s/\xc9\x49/Ï/gm;
- s/\xc9\x4f/Ö/gm;
- s/\xc9\x55/Ü/gm;
- s/\xc9\x61/ä/gm;
- s/\xc9\x6f/ö/gm;
- s/\xc9\x75/ü/gm;
- s/\xca\x41/Å/gm;
- s/\xca\x61/å/gm;
- s/\xd0\x43/Ç/gm;
- s/\xd0\x63/ç/gm;
-
- # this handles non-sorting blocks (if implementation requires this)
- $string = nsb_clean($_);
- }
- elsif ( $encoding eq "USMARC" || $encoding eq "MARC21" ) {
- if (/[\xc1-\xff]/) {
- s/\xe1\x61/à/gm;
- s/\xe1\x65/è/gm;
- s/\xe1\x69/ì/gm;
- s/\xe1\x6f/ò/gm;
- s/\xe1\x75/ù/gm;
- s/\xe1\x41/À/gm;
- s/\xe1\x45/È/gm;
- s/\xe1\x49/Ì/gm;
- s/\xe1\x4f/Ò/gm;
- s/\xe1\x55/Ù/gm;
- s/\xe2\x41/Á/gm;
- s/\xe2\x45/É/gm;
- s/\xe2\x49/Í/gm;
- s/\xe2\x4f/Ó/gm;
- s/\xe2\x55/Ú/gm;
- s/\xe2\x59/Ý/gm;
- s/\xe2\x61/á/gm;
- s/\xe2\x65/é/gm;
- s/\xe2\x69/í/gm;
- s/\xe2\x6f/ó/gm;
- s/\xe2\x75/ú/gm;
- s/\xe2\x79/ý/gm;
- s/\xe3\x41/Â/gm;
- s/\xe3\x45/Ê/gm;
- s/\xe3\x49/Î/gm;
- s/\xe3\x4f/Ô/gm;
- s/\xe3\x55/Û/gm;
- s/\xe3\x61/â/gm;
- s/\xe3\x65/ê/gm;
- s/\xe3\x69/î/gm;
- s/\xe3\x6f/ô/gm;
- s/\xe3\x75/û/gm;
- s/\xe4\x41/Ã/gm;
- s/\xe4\x4e/Ñ/gm;
- s/\xe4\x4f/Õ/gm;
- s/\xe4\x61/ã/gm;
- s/\xe4\x6e/ñ/gm;
- s/\xe4\x6f/õ/gm;
- s/\xe8\x45/Ë/gm;
- s/\xe8\x49/Ï/gm;
- s/\xe8\x65/ë/gm;
- s/\xe8\x69/ï/gm;
- s/\xe8\x76/ÿ/gm;
- s/\xe9\x41/Ä/gm;
- s/\xe9\x4f/Ö/gm;
- s/\xe9\x55/Ü/gm;
- s/\xe9\x61/ä/gm;
- s/\xe9\x6f/ö/gm;
- s/\xe9\x75/ü/gm;
- s/\xea\x41/Å/gm;
- s/\xea\x61/å/gm;
-
- # this handles non-sorting blocks (if implementation requires this)
- $string = nsb_clean($_);
- }
- }
- return ($string);
-}
-
-sub nsb_clean {
- my $NSB = '\x88'; # NSB : begin Non Sorting Block
- my $NSE = '\x89'; # NSE : Non Sorting Block end
- # handles non sorting blocks
- my ($string) = @_;
- $_ = $string;
- s/$NSB/(/gm;
- s/[ ]{0,1}$NSE/) /gm;
- $string = $_;
- return ($string);
-}
-
-sub FindDuplicate {
- my ($record)=@_;
- my $dbh = C4::Context->dbh;
- my $result = MARCmarc2koha($dbh,$record,'');
- my $sth;
- my ($biblionumber,$bibid,$title);
- # search duplicate on ISBN, easy and fast...
- if ($result->{isbn}) {
- $sth = $dbh->prepare("select biblio.biblionumber,bibid,title from biblio,biblioitems,marc_biblio where biblio.biblionumber=biblioitems.biblionumber and marc_biblio.biblionumber=biblioitems.biblionumber and isbn=?");
- $sth->execute($result->{'isbn'});
- ($biblionumber,$bibid,$title) = $sth->fetchrow;
- return $biblionumber,$bibid,$title if ($biblionumber);
- }
- # a more complex search : build a request for SearchMarc::catalogsearch()
- my (@tags, @and_or, @excluding, @operator, @value, $offset,$length);
- # search on biblio.title
- my ($tag,$subfield) = MARCfind_marc_from_kohafield($dbh,"biblio.title","");
- if ($record->field($tag)) {
- if ($record->field($tag)->subfields($subfield)) {
- push @tags, "'".$tag.$subfield."'";
- push @and_or, "and";
- push @excluding, "";
- push @operator, "contains";
- push @value, $record->field($tag)->subfield($subfield);
-# warn "for title, I add $tag / $subfield".$record->field($tag)->subfield($subfield);
- }
- }
- # ... and on biblio.author
- ($tag,$subfield) = MARCfind_marc_from_kohafield($dbh,"biblio.author","");
- if ($record->field($tag)) {
- if ($record->field($tag)->subfields($subfield)) {
- push @tags, "'".$tag.$subfield."'";
- push @and_or, "and";
- push @excluding, "";
- push @operator, "contains";
- push @value, $record->field($tag)->subfield($subfield);
-# warn "for author, I add $tag / $subfield".$record->field($tag)->subfield($subfield);
- }
- }
- # ... and on publicationyear.
- ($tag,$subfield) = MARCfind_marc_from_kohafield($dbh,"biblioitems.publicationyear","");
- if ($record->field($tag)) {
- if ($record->field($tag)->subfields($subfield)) {
- push @tags, "'".$tag.$subfield."'";
- push @and_or, "and";
- push @excluding, "";
- push @operator, "=";
- push @value, $record->field($tag)->subfield($subfield);
-# warn "for publicationyear, I add $tag / $subfield".$record->field($tag)->subfield($subfield);
- }
- }
- # ... and on size.
- ($tag,$subfield) = MARCfind_marc_from_kohafield($dbh,"biblioitems.size","");
- if ($record->field($tag)) {
- if ($record->field($tag)->subfields($subfield)) {
- push @tags, "'".$tag.$subfield."'";
- push @and_or, "and";
- push @excluding, "";
- push @operator, "=";
- push @value, $record->field($tag)->subfield($subfield);
-# warn "for size, I add $tag / $subfield".$record->field($tag)->subfield($subfield);
- }
- }
- # ... and on publisher.
- ($tag,$subfield) = MARCfind_marc_from_kohafield($dbh,"biblioitems.publishercode","");
- if ($record->field($tag)) {
- if ($record->field($tag)->subfields($subfield)) {
- push @tags, "'".$tag.$subfield."'";
- push @and_or, "and";
- push @excluding, "";
- push @operator, "=";
- push @value, $record->field($tag)->subfield($subfield);
-# warn "for publishercode, I add $tag / $subfield".$record->field($tag)->subfield($subfield);
- }
- }
- # ... and on volume.
- ($tag,$subfield) = MARCfind_marc_from_kohafield($dbh,"biblioitems.volume","");
- if ($record->field($tag)) {
- if ($record->field($tag)->subfields($subfield)) {
- push @tags, "'".$tag.$subfield."'";
- push @and_or, "and";
- push @excluding, "";
- push @operator, "=";
- push @value, $record->field($tag)->subfield($subfield);
-# warn "for volume, I add $tag / $subfield".$record->field($tag)->subfield($subfield);
- }
- }
-
- my ($finalresult,$nbresult) = C4::SearchMarc::catalogsearch($dbh,\@tags,\@and_or,\@excluding,\@operator,\@value,0,10);
- # there is at least 1 result => return the 1st one
- if ($nbresult) {
-# warn "$nbresult => ".@$finalresult[0]->{biblionumber},@$finalresult[0]->{bibid},@$finalresult[0]->{title};
- return @$finalresult[0]->{biblionumber},@$finalresult[0]->{bibid},@$finalresult[0]->{title};
- }
- # no result, returns nothing
- return;
-}
sub DisplayISBN {
+## Old style ISBN handling should be modified to accept 13 digits
+
my ($isbn)=@_;
my $seg1;
if(substr($isbn, 0, 1) <=7) {
my $seg4 = substr($x, -1, 1);
return "$seg1-$seg2-$seg3-$seg4";
}
+sub calculatelc{
+## Function to create padded LC call number for sorting items with their LC code. Not exported
+my ($classification)=@_;
+$classification=~s/^\s+|\s+$//g;
+my $i=0;
+my $lc2;
+my $lc1;
+for ($i=0; $i<length($classification);$i++){
+my $c=(substr($classification,$i,1));
+ if ($c ge '0' && $c le '9'){
+
+ $lc2=substr($classification,$i);
+ last;
+ }else{
+ $lc1.=substr($classification,$i,1);
+
+ }
+}#while
+
+my $other=length($lc1);
+if(!$lc1){$other=0;}
+my $extras;
+if ($other<4){
+ for (1..(4-$other)){
+ $extras.="0";
+ }
+}
+ $lc1.=$extras;
+$lc2=~ s/^ //g;
+
+$lc2=~ s/ //g;
+$extras="";
+##Find the decimal part of $lc2
+my $pos=index($lc2,".");
+if ($pos<0){$pos=length($lc2);}
+if ($pos>=0 && $pos<5){
+##Pad lc2 with zeros to create a 5digit decimal needed in marc record to sort as numeric
+
+ for (1..(5-$pos)){
+ $extras.="0";
+ }
+}
+$lc2=$extras.$lc2;
+return($lc1.$lc2);
+}
+
+sub itemcalculator{
+## Sublimentary function to obtain sorted LC for items. Not exported
+my ($dbh,$biblionumber,$callnumber)=@_;
+my $xmlhash=XMLgetbibliohash($dbh,$biblionumber);
+my $lc=XML_readline_onerecord($xmlhash,"classification","biblios");
+my $cutter=XML_readline_onerecord($xmlhash,"subclass","biblios");
+my $all=$lc." ".$cutter;
+my $total=length($all);
+my $cutterextra=substr($callnumber,$total);
+return $cutterextra;
+
+}
+
+
+#### This function allows decoding of only title and author out of a MARC record
+ sub func_title_author {
+ my ($tagno,$tagdata) = @_;
+ my ($titlef,$subf)=&MARCfind_marc_from_kohafield("title","biblios");
+ my ($authf,$subf)=&MARCfind_marc_from_kohafield("author","biblios");
+ return ($tagno == $titlef || $tagno == $authf);
+ }
+
END { } # module clean-up code here (global destructor)
Koha Developement team <info@koha.org>
-Paul POULAIN paul.poulain@free.fr
-=cut
-
-# $Id$
-# $Log$
-# Revision 1.125 2005/08/11 09:00:07 tipaul
-# Ok guys, this time, it seems that item add and modif begin working as expected...
-# Still a lot of bugs to fix, of course
-#
-# Revision 1.124 2005/08/10 10:21:15 tipaul
-# continuing the road to zebra :
-# - the biblio add begins to work.
-# - the biblio modif begins to work.
-#
-# (still without doing anything on zebra)
-# (no new change in updatedatabase)
-#
-# Revision 1.123 2005/08/09 14:10:28 tipaul
-# 1st commit to go to zebra.
-# don't update your cvs if you want to have a working head...
-#
-# this commit contains :
-# * updater/updatedatabase : get rid with marc_* tables, but DON'T remove them. As a lot of things uses them, it would not be a good idea for instance to drop them. If you really want to play, you can rename them to test head without them but being still able to reintroduce them...
-# * Biblio.pm : modify MARCgetbiblio to find the raw marc record in biblioitems.marc field, not from marc_subfield_table, modify MARCfindframeworkcode to find frameworkcode in biblio.frameworkcode, modify some other subs to use biblio.biblionumber & get rid of bibid.
-# * other files : get rid of bibid and use biblionumber instead.
-#
-# What is broken :
-# * does not do anything on zebra yet.
-# * if you rename marc_subfield_table, you can't search anymore.
-# * you can view a biblio & bibliodetails, go to MARC editor, but NOT save any modif.
-# * don't try to add a biblio, it would add data poorly... (don't try to delete either, it may work, but that would be a surprise ;-) )
-#
-# IMPORTANT NOTE : you need MARC::XML package (http://search.cpan.org/~esummers/MARC-XML-0.7/lib/MARC/File/XML.pm), that requires a recent version of MARC::Record
-# Updatedatabase stores the iso2709 data in biblioitems.marc field & an xml version in biblioitems.marcxml Not sure we will keep it when releasing the stable version, but I think it's a good idea to have something readable in sql, at least for development stage.
-# tipaul cutted previous commit notes
\ No newline at end of file