koha-cvs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Koha-cvs] CVS: koha/updater updatedatabase,1.119,1.120


From: Paul POULAIN
Subject: [Koha-cvs] CVS: koha/updater updatedatabase,1.119,1.120
Date: Tue, 09 Aug 2005 07:10:35 -0700

Update of /cvsroot/koha/koha/updater
In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv23879/updater

Modified Files:
        updatedatabase 
Log Message:
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.

Index: updatedatabase
===================================================================
RCS file: /cvsroot/koha/koha/updater/updatedatabase,v
retrieving revision 1.119
retrieving revision 1.120
diff -C2 -r1.119 -r1.120
*** updatedatabase      4 Aug 2005 16:07:58 -0000       1.119
--- updatedatabase      9 Aug 2005 14:10:32 -0000       1.120
***************
*** 21,24 ****
--- 21,27 ----
  use C4::Context;
  
+ use MARC::Record;
+ use MARC::File::XML;
+ 
  # FIXME - The user might be installing a new database, so can't rely
  # on /etc/koha.conf anyway.
***************
*** 43,46 ****
--- 46,50 ----
  my $dbh = C4::Context->dbh;
  print "connected to your DB. Checking & modifying it\n" unless $silent;
+ $|=1; # flushes output
  
  #-------------------
***************
*** 350,353 ****
--- 354,421 ----
  }
  
+ #
+ # SPECIFIC STUFF
+ #
+ #
+ # create frameworkcode row in biblio table & fill it with 
marc_biblio.frameworkcode.
+ #
+ 
+ # 1st, get how many biblio we will have to do...
+ $sth = $dbh->prepare('select count(*) from marc_biblio');
+ $sth->execute;
+ my ($totaltodo) = $sth->fetchrow;
+ 
+ $sth = $dbh->prepare("show columns from biblio");
+ $sth->execute();
+ my $definitions;
+ my $bibliofwexist=0;
+ while ( ( $column, $type, $null, $key, $default, $extra ) = $sth->fetchrow ){
+       $bibliofwexist=1 if $column eq 'frameworkcode';
+ }
+ unless ($bibliofwexist) {
+       print "moving biblioframework to biblio table\n";
+       $dbh->do('ALTER TABLE `biblio` ADD `frameworkcode` VARCHAR( 4 ) NOT 
NULL AFTER `biblionumber`');
+       $sth = $dbh->prepare('select biblionumber,frameworkcode from 
marc_biblio');
+       $sth->execute;
+       my $sth_update = $dbh->prepare('update biblio set frameworkcode=? where 
biblionumber=?');
+       my $totaldone=0;
+       while (my ($biblionumber,$frameworkcode) = $sth->fetchrow) {
+               $sth_update->execute($frameworkcode,$biblionumber);
+               $totaldone++;
+               print "\r$totaldone / $totaltodo" unless ($totaldone % 100);
+       }
+       print "\rdone\n";
+ }
+ 
+ #
+ # moving MARC data from marc_subfield_table to biblioitems.marc
+ #
+ $sth = $dbh->prepare("show columns from biblioitems");
+ $sth->execute();
+ my $definitions;
+ my $marcdone=0;
+ while ( ( $column, $type, $null, $key, $default, $extra ) = $sth->fetchrow ){
+       $marcdone=1 if ($type eq 'blob' && $column eq 'marc') ;
+ }
+ unless ($marcdone) {
+       print "moving MARC record to biblioitems table\n";
+       # changing marc field type
+       $dbh->do('ALTER TABLE `biblioitems` CHANGE `marc` `marc` BLOB NULL 
DEFAULT NULL ');
+       # adding marc xml, just for convenience
+       $dbh->do('ALTER TABLE `biblioitems` ADD `marcxml` TEXT NOT NULL');
+       # moving data from marc_subfield_value to biblio
+       $sth = $dbh->prepare('select bibid,biblionumber from marc_biblio');
+       $sth->execute;
+       my $sth_update = $dbh->prepare('update biblioitems set marc=?, 
marcxml=? where biblionumber=?');
+       my $totaldone=0;
+       while (my ($bibid,$biblionumber) = $sth->fetchrow) {
+               my $record = MARCgetbiblio($dbh,$bibid);
+               
$sth_update->execute($record->as_usmarc(),$record->as_xml(),$biblionumber);
+               $totaldone++;
+               print "\r$totaldone / $totaltodo" unless ($totaldone % 100);
+       }
+       print "\rdone\n";
+ }
+ 
  # at last, remove useless fields
  foreach $table ( keys %uselessfields ) {
***************
*** 376,382 ****
--- 444,631 ----
  $sth->finish;
  
+ #
+ # those 2 subs are a copy of Biblio.pm, version 2.2.4
+ # they are useful only once, for moving from 2.2 to 3.0
+ # the MARCgetbiblio & MARCgetitem subs in Biblio.pm
+ # are still here, but uses other tables
+ # (the ones that are filled by updatedatabase !)
+ #
+ sub MARCgetbiblio {
+ 
+     # Returns MARC::Record of the biblio passed in parameter.
+     my ( $dbh, $bibid ) = @_;
+     my $record = MARC::Record->new();
+ #     warn "". $bidid;
+ 
+     my $sth =
+       $dbh->prepare(
+ "select 
bibid,subfieldid,tag,tagorder,tag_indicator,subfieldcode,subfieldorder,subfieldvalue,valuebloblink
+                                from marc_subfield_table
+                                where bibid=? order by 
tag,tagorder,subfieldorder
+                        "
+     );
+     my $sth2 =
+       $dbh->prepare(
+         "select subfieldvalue from marc_blob_subfield where blobidlink=?");
+     $sth->execute($bibid);
+     my $prevtagorder = 1;
+     my $prevtag      = 'XXX';
+     my $previndicator;
+     my $field;        # for >=10 tags
+     my $prevvalue;    # for <10 tags
+     while ( my $row = $sth->fetchrow_hashref ) {
+ 
+         if ( $row->{'valuebloblink'} ) {    #---- search blob if there is one
+             $sth2->execute( $row->{'valuebloblink'} );
+             my $row2 = $sth2->fetchrow_hashref;
+             $sth2->finish;
+             $row->{'subfieldvalue'} = $row2->{'subfieldvalue'};
+         }
+         if ( $row->{tagorder} ne $prevtagorder || $row->{tag} ne $prevtag ) {
+             $previndicator .= "  ";
+             if ( $prevtag < 10 ) {
+                               if ($prevtag ne '000') {
+                       $record->add_fields( ( sprintf "%03s", $prevtag ), 
$prevvalue ) unless $prevtag eq "XXX";    # ignore the 1st loop
+                               } else {
+                                       
$record->leader(sprintf("%24s",$prevvalue));
+                               }
+             }
+             else {
+                 $record->add_fields($field) unless $prevtag eq "XXX";
+             }
+             undef $field;
+             $prevtagorder  = $row->{tagorder};
+             $prevtag       = $row->{tag};
+             $previndicator = $row->{tag_indicator};
+             if ( $row->{tag} < 10 ) {
+                 $prevvalue = $row->{subfieldvalue};
+             }
+             else {
+                 $field = MARC::Field->new(
+                     ( sprintf "%03s", $prevtag ),
+                     substr( $row->{tag_indicator} . '  ', 0, 1 ),
+                     substr( $row->{tag_indicator} . '  ', 1, 1 ),
+                     $row->{'subfieldcode'},
+                     $row->{'subfieldvalue'}
+                 );
+             }
+         }
+         else {
+             if ( $row->{tag} < 10 ) {
+                 $record->add_fields( ( sprintf "%03s", $row->{tag} ),
+                     $row->{'subfieldvalue'} );
+             }
+             else {
+                 $field->add_subfields( $row->{'subfieldcode'},
+                     $row->{'subfieldvalue'} );
+             }
+             $prevtag       = $row->{tag};
+             $previndicator = $row->{tag_indicator};
+         }
+     }
+ 
+     # the last has not been included inside the loop... do it now !
+     if ( $prevtag ne "XXX" )
+     { # check that we have found something. Otherwise, prevtag is still XXX 
and we
+          # must return an empty record, not make MARC::Record fail because we 
try to
+          # create a record with XXX as field :-(
+         if ( $prevtag < 10 ) {
+             $record->add_fields( $prevtag, $prevvalue );
+         }
+         else {
+ 
+             #                 my $field = MARC::Field->new( $prevtag, "", "", 
%subfieldlist);
+             $record->add_fields($field);
+         }
+     }
+     return $record;
+ }
+ 
+ sub MARCgetitem {
+ 
+     # Returns MARC::Record of the biblio passed in parameter.
+     my ( $dbh, $bibid, $itemnumber ) = @_;
+     my $record = MARC::Record->new();
+ 
+     # search MARC tagorder
+     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();
+ 
+     #---- TODO : the leader is missing
+     my $sth =
+       $dbh->prepare(
+ "select 
bibid,subfieldid,tag,tagorder,tag_indicator,subfieldcode,subfieldorder,subfieldvalue,valuebloblink
+                                from marc_subfield_table
+                                where bibid=? and tagorder=? order by 
subfieldcode,subfieldorder
+                        "
+     );
+     $sth2 =
+       $dbh->prepare(
+         "select subfieldvalue from marc_blob_subfield where blobidlink=?");
+     $sth->execute( $bibid, $tagorder );
+     while ( my $row = $sth->fetchrow_hashref ) {
+         if ( $row->{'valuebloblink'} ) {    #---- search blob if there is one
+             $sth2->execute( $row->{'valuebloblink'} );
+             my $row2 = $sth2->fetchrow_hashref;
+             $sth2->finish;
+             $row->{'subfieldvalue'} = $row2->{'subfieldvalue'};
+         }
+         if ( $record->field( $row->{'tag'} ) ) {
+             my $field;
+ 
+ #--- this test must stay as this, because of strange behaviour of mySQL/Perl 
DBI with char var containing a number...
+             #--- sometimes, eliminates 0 at beginning, sometimes no ;-\\\
+             if ( length( $row->{'tag'} ) < 3 ) {
+                 $row->{'tag'} = "0" . $row->{'tag'};
+             }
+             $field = $record->field( $row->{'tag'} );
+             if ($field) {
+                 my $x =
+                   $field->add_subfields( $row->{'subfieldcode'},
+                     $row->{'subfieldvalue'} );
+                 $record->delete_field($field);
+                 $record->add_fields($field);
+             }
+         }
+         else {
+             if ( length( $row->{'tag'} ) < 3 ) {
+                 $row->{'tag'} = "0" . $row->{'tag'};
+             }
+             my $temp =
+               MARC::Field->new( $row->{'tag'}, " ", " ",
+                 $row->{'subfieldcode'} => $row->{'subfieldvalue'} );
+             $record->add_fields($temp);
+         }
+ 
+     }
+     return $record;
+ }
+ 
+ 
  exit;
  
  # $Log$
+ # Revision 1.120  2005/08/09 14:10:32  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.
+ #
  # Revision 1.119  2005/08/04 16:07:58  tipaul
  # Synch really broke this script...




reply via email to

[Prev in Thread] Current Thread [Next in Thread]