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

Paul POULAIN tipaul at users.sourceforge.net
Tue Aug 9 16:10:35 CEST 2005


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...





More information about the Koha-cvs mailing list