[Top][All Lists]
[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...
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [Koha-cvs] CVS: koha/updater updatedatabase,1.119,1.120,
Paul POULAIN <=
- Prev by Date:
[Koha-cvs] CVS: koha/acqui.simple addbiblio.pl,1.59,1.60 additem.pl,1.31,1.32
- Next by Date:
[Koha-cvs] CVS: koha/reports catalogue_stats.pl,1.13,1.14
- Previous by thread:
[Koha-cvs] CVS: koha/acqui.simple addbiblio.pl,1.59,1.60 additem.pl,1.31,1.32
- Next by thread:
[Koha-cvs] CVS: koha/reports catalogue_stats.pl,1.13,1.14
- Index(es):