-#'
-sub ItemInfo {
- my ($env,$biblionumber,$type) = @_;
- my $dbh = C4::Context->dbh;
- my $query = "SELECT *,items.notforloan as itemnotforloan FROM items, biblio, biblioitems
- left join itemtypes on biblioitems.itemtype = itemtypes.itemtype
- WHERE items.biblionumber = ?
- AND biblioitems.biblioitemnumber = items.biblioitemnumber
- AND biblio.biblionumber = items.biblionumber";
- $query .= " order by items.dateaccessioned desc";
- my $sth=$dbh->prepare($query);
- $sth->execute($biblionumber);
- my $i=0;
- my @results;
- while (my $data=$sth->fetchrow_hashref){
- my $datedue = '';
- my $isth=$dbh->prepare("Select issues.*,borrowers.cardnumber from issues,borrowers where itemnumber = ? and returndate is null and issues.borrowernumber=borrowers.borrowernumber");
- $isth->execute($data->{'itemnumber'});
- if (my $idata=$isth->fetchrow_hashref){
- $data->{borrowernumber} = $idata->{borrowernumber};
- $data->{cardnumber} = $idata->{cardnumber};
- $datedue = format_date($idata->{'date_due'});
- }
- if ($datedue eq ''){
- my ($restype,$reserves)=C4::Reserves2::CheckReserves($data->{'itemnumber'});
- if ($restype) {
- $datedue=$restype;
- }
- }
- $isth->finish;
- #get branch information.....
- my $bsth=$dbh->prepare("SELECT * FROM branches WHERE branchcode = ?");
- $bsth->execute($data->{'holdingbranch'});
- if (my $bdata=$bsth->fetchrow_hashref){
- $data->{'branchname'} = $bdata->{'branchname'};
- }
- my $date=format_date($data->{'datelastseen'});
- $data->{'datelastseen'}=$date;
- $data->{'datedue'}=$datedue;
- # get notforloan complete status if applicable
- my $sthnflstatus = $dbh->prepare('select authorised_value from marc_subfield_structure where kohafield="items.notforloan"');
- $sthnflstatus->execute;
- my ($authorised_valuecode) = $sthnflstatus->fetchrow;
- if ($authorised_valuecode) {
- $sthnflstatus = $dbh->prepare("select lib from authorised_values where category=? and authorised_value=?");
- $sthnflstatus->execute($authorised_valuecode,$data->{itemnotforloan});
- my ($lib) = $sthnflstatus->fetchrow;
- $data->{notforloan} = $lib;
- }
- $results[$i]=$data;
- $i++;
- }
- $sth->finish;
- return(@results);
-}
-
-=item bibitems
-
- ($count, @results) = &bibitems($biblionumber);
-
-Given the biblionumber for a book, C<&bibitems> looks up that book's
-biblioitems (different publications of the same book, the audio book
-and film versions, etc.).
-
-C<$count> is the number of elements in C<@results>.
-
-C<@results> is an array of references-to-hash; the keys are the fields
-of the C<biblioitems> and C<itemtypes> tables of the Koha database. In
-addition, C<itemlost> indicates the availability of the item: if it is
-"2", then all copies of the item are long overdue; if it is "1", then
-all copies are lost; otherwise, there is at least one copy available.
-
-=cut
-#'
-sub bibitems {
- my ($bibnum) = @_;
- my $dbh = C4::Context->dbh;
- my $sth = $dbh->prepare("SELECT biblioitems.*,
- itemtypes.*,
- MIN(items.itemlost) as itemlost,
- MIN(items.dateaccessioned) as dateaccessioned
- FROM biblioitems, itemtypes, items
- WHERE biblioitems.biblionumber = ?
- AND biblioitems.itemtype = itemtypes.itemtype
- AND biblioitems.biblioitemnumber = items.biblioitemnumber
- GROUP BY items.biblioitemnumber");
- my $count = 0;
- my @results;
- $sth->execute($bibnum);
- while (my $data = $sth->fetchrow_hashref) {
- $results[$count] = $data;
- $count++;
- } # while
- $sth->finish;
- return($count, @results);
-} # sub bibitems
-
-
-=item bibitemdata
-
- $itemdata = &bibitemdata($biblioitemnumber);
-
-Looks up the biblioitem with the given biblioitemnumber. Returns a
-reference-to-hash. The keys are the fields from the C<biblio>,
-C<biblioitems>, and C<itemtypes> tables in the Koha database, except
-that C<biblioitems.notes> is given as C<$itemdata-E<gt>{bnotes}>.
-
-=cut
-#'
-sub bibitemdata {
- my ($bibitem) = @_;
- my $dbh = C4::Context->dbh;
- my $sth = $dbh->prepare("Select *,biblioitems.notes as bnotes from biblio, biblioitems,itemtypes where biblio.biblionumber = biblioitems.biblionumber and biblioitemnumber = ? and biblioitems.itemtype = itemtypes.itemtype");
- my $data;
-
- $sth->execute($bibitem);
-
- $data = $sth->fetchrow_hashref;
-
- $sth->finish;
- return($data);
-} # sub bibitemdata
-
-
-=item getbibliofromitemnumber
-
- $item = &getbibliofromitemnumber($env, $dbh, $itemnumber);
-
-Looks up the item with the given itemnumber.
-
-C<$env> and C<$dbh> are ignored.
-
-C<&itemnodata> returns a reference-to-hash whose keys are the fields
-from the C<biblio>, C<biblioitems>, and C<items> tables in the Koha
-database.
-
-=cut
-#'
-sub getbibliofromitemnumber {
- my ($env,$dbh,$itemnumber) = @_;
- $dbh = C4::Context->dbh;
- my $sth=$dbh->prepare("Select * from biblio,items,biblioitems
- where items.itemnumber = ?
- and biblio.biblionumber = items.biblionumber
- and biblioitems.biblioitemnumber = items.biblioitemnumber");
-# print $query;
- $sth->execute($itemnumber);
- my $data=$sth->fetchrow_hashref;
- $sth->finish;
- return($data);
-}
-
-=item barcodes
-
- @barcodes = &barcodes($biblioitemnumber);
-
-Given a biblioitemnumber, looks up the corresponding items.
-
-Returns an array of references-to-hash; the keys are C<barcode> and
-C<itemlost>.
-
-The returned items include very overdue items, but not lost ones.
-
-=cut
-#'
-sub barcodes{
- #called from request.pl
- my ($biblioitemnumber)=@_;
- my $dbh = C4::Context->dbh;
- my $sth=$dbh->prepare("SELECT barcode, itemlost, holdingbranch FROM items
- WHERE biblioitemnumber = ?
- AND (wthdrawn <> 1 OR wthdrawn IS NULL)");
- $sth->execute($biblioitemnumber);
- my @barcodes;
- my $i=0;
- while (my $data=$sth->fetchrow_hashref){
- $barcodes[$i]=$data;
- $i++;
- }
- $sth->finish;
- return(@barcodes);
-}
-
-
-=item itemdata
-
- $item = &itemdata($barcode);
-
-Looks up the item with the given barcode, and returns a
-reference-to-hash containing information about that item. The keys of
-the hash are the fields from the C<items> and C<biblioitems> tables in
-the Koha database.
-
-=cut
-#'
-sub get_item_from_barcode {
- my ($barcode)=@_;
- my $dbh = C4::Context->dbh;
- my $sth=$dbh->prepare("Select * from items,biblioitems where barcode=?
- and items.biblioitemnumber=biblioitems.biblioitemnumber");
- $sth->execute($barcode);
- my $data=$sth->fetchrow_hashref;
- $sth->finish;
- return($data);
-}
-
-
-=item itemissues
-
- @issues = &itemissues($biblioitemnumber, $biblio);
-
-Looks up information about who has borrowed the bookZ<>(s) with the
-given biblioitemnumber.
-
-C<$biblio> is ignored.
-
-C<&itemissues> returns an array of references-to-hash. The keys
-include the fields from the C<items> table in the Koha database.
-Additional keys include:
-
-=over 4
-
-=item C<date_due>
-
-If the item is currently on loan, this gives the due date.
-
-If the item is not on loan, then this is either "Available" or
-"Cancelled", if the item has been withdrawn.
-
-=item C<card>
-
-If the item is currently on loan, this gives the card number of the
-patron who currently has the item.
-
-=item C<timestamp0>, C<timestamp1>, C<timestamp2>
-
-These give the timestamp for the last three times the item was
-borrowed.
-
-=item C<card0>, C<card1>, C<card2>
-
-The card number of the last three patrons who borrowed this item.
-
-=item C<borrower0>, C<borrower1>, C<borrower2>
-
-The borrower number of the last three patrons who borrowed this item.
-
-=back
-
-=cut
-#'
-sub itemissues {
- my ($bibitem, $biblio)=@_;
- my $dbh = C4::Context->dbh;
- # FIXME - If this function die()s, the script will abort, and the
- # user won't get anything; depending on how far the script has
- # gotten, the user might get a blank page. It would be much better
- # to at least print an error message. The easiest way to do this
- # is to set $SIG{__DIE__}.
- my $sth = $dbh->prepare("Select * from items where
-items.biblioitemnumber = ?")
- || die $dbh->errstr;
- my $i = 0;
- my @results;
-
- $sth->execute($bibitem)
- || die $sth->errstr;
-
- while (my $data = $sth->fetchrow_hashref) {
- # Find out who currently has this item.
- # FIXME - Wouldn't it be better to do this as a left join of
- # some sort? Currently, this code assumes that if
- # fetchrow_hashref() fails, then the book is on the shelf.
- # fetchrow_hashref() can fail for any number of reasons (e.g.,
- # database server crash), not just because no items match the
- # search criteria.
- my $sth2 = $dbh->prepare("select * from issues,borrowers
-where itemnumber = ?
-and returndate is NULL
-and issues.borrowernumber = borrowers.borrowernumber");
-
- $sth2->execute($data->{'itemnumber'});
- if (my $data2 = $sth2->fetchrow_hashref) {
- $data->{'date_due'} = $data2->{'date_due'};
- $data->{'card'} = $data2->{'cardnumber'};
- $data->{'borrower'} = $data2->{'borrowernumber'};
- } else {
- if ($data->{'wthdrawn'} eq '1') {
- $data->{'date_due'} = 'Cancelled';
- } else {
- $data->{'date_due'} = 'Available';
- } # else
- } # else
-
- $sth2->finish;
-
- # Find the last 3 people who borrowed this item.
- $sth2 = $dbh->prepare("select * from issues, borrowers
- where itemnumber = ?
- and issues.borrowernumber = borrowers.borrowernumber
- and returndate is not NULL
- order by returndate desc,timestamp desc") || die $dbh->errstr;
- $sth2->execute($data->{'itemnumber'}) || die $sth2->errstr;
- for (my $i2 = 0; $i2 < 2; $i2++) { # FIXME : error if there is less than 3 pple borrowing this item
- if (my $data2 = $sth2->fetchrow_hashref) {
- $data->{"timestamp$i2"} = $data2->{'timestamp'};
- $data->{"card$i2"} = $data2->{'cardnumber'};
- $data->{"borrower$i2"} = $data2->{'borrowernumber'};
- } # if
- } # for
-
- $sth2->finish;
- $results[$i] = $data;
- $i++;
- }
-
- $sth->finish;
- return(@results);
-}
-
-=item getsubject
-
- ($count, $subjects) = &getsubject($biblionumber);
-
-Looks up the subjects of the book with the given biblionumber. Returns
-a two-element list. C<$subjects> is a reference-to-array, where each
-element is a subject of the book, and C<$count> is the number of
-elements in C<$subjects>.
-
-=cut
-#'
-sub getsubject {
- my ($bibnum)=@_;
- my $dbh = C4::Context->dbh;
- my $sth=$dbh->prepare("Select * from bibliosubject where biblionumber=?");
- $sth->execute($bibnum);
- my @results;
- my $i=0;
- while (my $data=$sth->fetchrow_hashref){
- $results[$i]=$data;
- $i++;
- }
- $sth->finish;
- return($i,\@results);
-}
-
-=item getaddauthor
-
- ($count, $authors) = &getaddauthor($biblionumber);
-
-Looks up the additional authors for the book with the given
-biblionumber.
-
-Returns a two-element list. C<$authors> is a reference-to-array, where
-each element is an additional author, and C<$count> is the number of
-elements in C<$authors>.
-
-=cut
-#'
-sub getaddauthor {
- my ($bibnum)=@_;
- my $dbh = C4::Context->dbh;
- my $sth=$dbh->prepare("Select * from additionalauthors where biblionumber=?");
- $sth->execute($bibnum);
- my @results;
- my $i=0;
- while (my $data=$sth->fetchrow_hashref){
- $results[$i]=$data;
- $i++;
- }
- $sth->finish;
- return($i,\@results);
-}
-
-
-=item getsubtitle
-
- ($count, $subtitles) = &getsubtitle($biblionumber);
-
-Looks up the subtitles for the book with the given biblionumber.
-
-Returns a two-element list. C<$subtitles> is a reference-to-array,
-where each element is a subtitle, and C<$count> is the number of
-elements in C<$subtitles>.
-
-=cut
-#'
-sub getsubtitle {
- my ($bibnum)=@_;
- my $dbh = C4::Context->dbh;
- my $sth=$dbh->prepare("Select * from bibliosubtitle where biblionumber=?");
- $sth->execute($bibnum);
- my @results;
- my $i=0;
- while (my $data=$sth->fetchrow_hashref){
- $results[$i]=$data;
- $i++;
- }
- $sth->finish;
- return($i,\@results);
-}
-
-
-=item getwebsites
-
- ($count, @websites) = &getwebsites($biblionumber);
-
-Looks up the web sites pertaining to the book with the given
-biblionumber.
-
-C<$count> is the number of elements in C<@websites>.
-
-C<@websites> is an array of references-to-hash; the keys are the
-fields from the C<websites> table in the Koha database.
-
-=cut
-#FIXME : could maybe be deleted. Otherwise, would be better in a Websites.pm package
-#(with add / modify / delete subs)
-
-sub getwebsites {
- my ($biblionumber) = @_;
- my $dbh = C4::Context->dbh;
- my $sth = $dbh->prepare("Select * from websites where biblionumber = ?");
- my $count = 0;
- my @results;
-
- $sth->execute($biblionumber);
- while (my $data = $sth->fetchrow_hashref) {
- # FIXME - The URL scheme shouldn't be stripped off, at least
- # not here, since it's part of the URL, and will be useful in
- # constructing a link to the site. If you don't want the user
- # to see the "http://" part, strip that off when building the
- # HTML code.
- $data->{'url'} =~ s/^http:\/\///; # FIXME - Leaning toothpick
- # syndrome
- $results[$count] = $data;
- $count++;
- } # while
-
- $sth->finish;
- return($count, @results);
-} # sub getwebsites
-
-=item getwebbiblioitems
-
- ($count, @results) = &getwebbiblioitems($biblionumber);
-
-Given a book's biblionumber, looks up the web versions of the book
-(biblioitems with itemtype C<WEB>).
-
-C<$count> is the number of items in C<@results>. C<@results> is an
-array of references-to-hash; the keys are the items from the
-C<biblioitems> table of the Koha database.
-
-=cut
-#'
-sub getwebbiblioitems {
- my ($biblionumber) = @_;
- my $dbh = C4::Context->dbh;
- my $sth = $dbh->prepare("Select * from biblioitems where biblionumber = ?
-and itemtype = 'WEB'");
- my $count = 0;
- my @results;
-
- $sth->execute($biblionumber);
- while (my $data = $sth->fetchrow_hashref) {
- $data->{'url'} =~ s/^http:\/\///;
- $results[$count] = $data;
- $count++;
- } # while
-
- $sth->finish;
- return($count, @results);
-} # sub getwebbiblioitems
-
-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 {
- my ($isbn)=@_;
- my $seg1;
- if(substr($isbn, 0, 1) <=7) {
- $seg1 = substr($isbn, 0, 1);
- } elsif(substr($isbn, 0, 2) <= 94) {
- $seg1 = substr($isbn, 0, 2);
- } elsif(substr($isbn, 0, 3) <= 995) {
- $seg1 = substr($isbn, 0, 3);
- } elsif(substr($isbn, 0, 4) <= 9989) {
- $seg1 = substr($isbn, 0, 4);
- } else {
- $seg1 = substr($isbn, 0, 5);
- }
- my $x = substr($isbn, length($seg1));
- my $seg2;
- if(substr($x, 0, 2) <= 19) {
-# if(sTmp2 < 10) sTmp2 = "0" sTmp2;
- $seg2 = substr($x, 0, 2);
- } elsif(substr($x, 0, 3) <= 699) {
- $seg2 = substr($x, 0, 3);
- } elsif(substr($x, 0, 4) <= 8399) {
- $seg2 = substr($x, 0, 4);
- } elsif(substr($x, 0, 5) <= 89999) {
- $seg2 = substr($x, 0, 5);
- } elsif(substr($x, 0, 6) <= 9499999) {
- $seg2 = substr($x, 0, 6);
- } else {
- $seg2 = substr($x, 0, 7);
- }
- my $seg3=substr($x,length($seg2));
- $seg3=substr($seg3,0,length($seg3)-1) ;
- my $seg4 = substr($x, -1, 1);
- return "$seg1-$seg2-$seg3-$seg4";
-}
-
-
-END { } # module clean-up code here (global destructor)
-
-=back
-
-=head1 AUTHOR
-
-Koha Developement team <info@koha.org>
-
-Paul POULAIN paul.poulain@free.fr
-
-=cut
-
-# $Id$
-# $Log$
-# Revision 1.152 2006/02/25 21:17:20 kados
-# Purely documentation change: converted all =head2 entries to use function
-# name as title rather than usage as title
-#
-# Revision 1.151 2006/02/25 21:02:20 kados
-#
-# Further cleanup, convering new routines to 4-chars
-#
-# Revision 1.150 2006/02/25 20:49:15 kados
-# Better documentation, added warning if serviceType is 'drop' since it's
-# not supported in Zebra.
-#
-# Revision 1.149 2006/02/25 20:30:32 kados
-# IMPORTANT: Paul, I've removed the decode_char routine because it's no
-# longer necessary. If we need to convert from MARC-8 for display, we should:
-#
-# 1. use utf-8
-# 2. do it with MARC::Charset
-#
-# If you still need it, let me know and I'll put it back in.
-#
-# Revision 1.148 2006/02/25 19:23:01 kados
-# cleaning up POD docs, deleting zebra_create as it's no longer used (
-# replaced by z3950_extended_services).
-#
-# Revision 1.147 2006/02/25 19:09:59 kados
-# readding some lost subs
-#
-# Revision 1.145 2006/02/22 01:02:39 kados
-# Replacing all calls to zebra_update with calls to
-# z3950_extended_services. More work coming, but it's
-# working now.
-#
-# Revision 1.144 2006/02/20 14:22:38 kados
-# typo
-#
-# Revision 1.143 2006/02/20 13:26:11 kados
-# A new subroutine to handle Z39.50 extended services. You pass it a
-# connection object, service type, service options, and a record, and
-# it performs the service and handles any exception found.
-#
-# Revision 1.142 2006/02/16 20:49:56 kados
-# destroy a connection after we're done -- we really should just have one
-# connection object and not destroy it until the whole transaction is
-# finished -- but this will do for now
-#
-# Revision 1.141 2006/02/16 19:47:22 rangi
-# Trying to error trap a little more.
-#
-# Revision 1.140 2006/02/14 21:36:03 kados
-# adding a 'use ZOOM' to biblio.pm, needed for non-mod_perl install.
-# also adding diagnostic error if not able to connect to Zebra
-#
-# Revision 1.139 2006/02/14 19:53:25 rangi
-# Just a little missing my
-#
-# Seems to be working great Paul, and I like what you did with zebradb
-#
-# Revision 1.138 2006/02/14 11:25:22 tipaul
-# road to 3.0 : updating a biblio in zebra seems to work. Still working on it, there are probably some bugs !
-#
-# Revision 1.137 2006/02/13 16:34:26 tipaul
-# fixing some warnings (perl -w should be quiet)
-#
-# Revision 1.136 2006/01/10 17:01:29 tipaul
-# adding a XMLgetbiblio in Biblio.pm (1st draft, to use with zebra)
-#
-# Revision 1.135 2006/01/06 16:39:37 tipaul
-# synch'ing head and rel_2_2 (from 2.2.5, including npl templates)
-# Seems not to break too many things, but i'm probably wrong here.
-# at least, new features/bugfixes from 2.2.5 are here (tested on some features on my head local copy)
-#
-# - removing useless directories (koha-html and koha-plucene)
-#
-# Revision 1.134 2006/01/04 15:54:55 tipaul
-# utf8 is a : go for beta test in HEAD.
-# some explanations :
-# - updater/updatedatabase => will transform all tables in innoDB (not related to utf8, just to warn you) AND collate them in utf8 / utf8_general_ci. The SQL command is : ALTER TABLE tablename DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci.
-# - *-top.inc will show the pages in utf8
-# - THE HARD THING : for me, mysql-client and mysql-server were set up to communicate in iso8859-1, whatever the mysql collation ! Thus, pages were improperly shown, as datas were transmitted in iso8859-1 format ! After a full day of investigation, someone on usenet pointed "set NAMES 'utf8'" to explain that I wanted utf8. I could put this in my.cnf, but if I do that, ALL databases will "speak" in utf8, that's not what we want. Thus, I added a line in Context.pm : everytime a DB handle is opened, the communication is set to utf8.
-# - using marcxml field and no more the iso2709 raw marc biblioitems.marc field.
-#
-# Revision 1.133 2005/12/12 14:25:51 thd
-#
-#
-# Reverse array filled with elements from repeated subfields
-# to avoid last to first concatenation of elements in Koha DB.-
-#
-# Revision 1.132 2005-10-26 09:12:33 tipaul
-# big commit, still breaking things...
-#
-# * synch with rel_2_2. Probably the last non manual synch, as rel_2_2 should not be modified deeply.
-# * code cleaning (cleaning warnings from perl -w) continued
-#
-# Revision 1.131 2005/09/22 10:01:45 tipaul
-# see mail on koha-devel : code cleaning on Search.pm + normalizing API + use of biblionumber everywhere (instead of bn, biblio, ...)
-#
-# Revision 1.130 2005/09/02 14:34:14 tipaul
-# continuing the work to move to zebra. Begin of work for MARC=OFF support.
-# IMPORTANT NOTE : the MARCkoha2marc sub API has been modified. Instead of biblionumber & biblioitemnumber, it now gets a hash.
-# The sub is used only in Biblio.pm, so the API change should be harmless (except for me, but i'm aware ;-) )
-#
-# Revision 1.129 2005/08/12 13:50:31 tipaul
-# removing useless sub declarations
-#
-# Revision 1.128 2005/08/11 16:12:47 tipaul
-# Playing with the zebra...
-#
-# * go to koha cvs home directory
-# * in misc/zebra there is a unimarc directory. I suggest that marc21 libraries create a marc21 directory
-# * put your zebra.cfg files here & create your database.
-# * from koha cvs home directory, ln -s misc/zebra/marc21 zebra (I mean create a symbolic link to YOUR zebra directory)
-# * now, everytime you add/modify a biblio/item your zebra DB is updated correctly.
-#
-# NOTE :
-# * this uses a system call in perl. CPU consumming, but we are waiting for indexdata Perl/zoom
-# * deletion still not work
-# * UNIMARC zebra config files are provided in misc/zebra/unimarc directory. The most important line being :
-# in zebra.cfg :
-# recordId: (bib1,Local-number)
-# storeKeys:1
-#
-# in .abs file :
-# elm 090 Local-number -
-# elm 090/? Local-number -
-# elm 090/?/9 Local-number !:w
-#
-# (090$9 being the field mapped to biblio.biblionumber in Koha)
-#
-# Revision 1.127 2005/08/11 14:37:32 tipaul
-# * POD documenting
-# * removing useless subs
-# * removing some subs that are also elsewhere
-# * renaming all OLDxxx subs to REALxxx subs (should not change anything, as OLDxxx, as well as REAL, are supposed to be for Biblio.pm internal use only)
-#
-# Revision 1.126 2005/08/11 09:13:28 tipaul
-# just removing useless subs (a lot !!!) for code cleaning
-#
-# 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