X-Git-Url: http://git.equinoxoli.org/?p=migration-tools.git;a=blobdiff_plain;f=Equinox-Migration%2Flib%2FEquinox%2FMigration%2FMapDrivenMARCXMLProc.pm;h=ca82ca7e6328c6a17b48de26f1216a791a64cd30;hp=83cb06016c3193c9bf9432c6d9fefc6a7420a8f7;hb=d1d70c501f6592ae84fc351e4325e5a5f9a67376;hpb=df9e0862d7090f8daaf9fc07c449c9dbdee89d05 diff --git a/Equinox-Migration/lib/Equinox/Migration/MapDrivenMARCXMLProc.pm b/Equinox-Migration/lib/Equinox/Migration/MapDrivenMARCXMLProc.pm index 83cb060..ca82ca7 100644 --- a/Equinox-Migration/lib/Equinox/Migration/MapDrivenMARCXMLProc.pm +++ b/Equinox-Migration/lib/Equinox/Migration/MapDrivenMARCXMLProc.pm @@ -4,7 +4,6 @@ use warnings; use strict; use XML::Twig; -use DBM::Deep; use Equinox::Migration::SubfieldMapper 1.004; @@ -14,15 +13,16 @@ Equinox::Migration::MapDrivenMARCXMLProc =head1 VERSION -Version 1.002 +Version 1.004 =cut -our $VERSION = '1.002'; +our $VERSION = '1.004'; my $dstore; my $sfmap; my @mods = qw( multi bib required ); +my $multis = {}; my $reccount; my $verbose = 0; @@ -53,7 +53,7 @@ sub new { $verbose = 1 if $args{verbose}; - my $self = bless { + my $self = bless { multis => \$multis, }, $class; # initialize map and taglist @@ -62,12 +62,7 @@ sub new { mods => \@mods ); # initialize datastore - die "Datastore file 'EMMXSSTORAGE.dbmd' already exists. Exiting.\n" - if (-e "EMMXSSTORAGE.dbmd"); - $dstore = DBM::Deep->new( file => "EMMXSSTORAGE.dbmd", - data_sector_size => 256, - autoflush => 0, - ); + $dstore = {}; $reccount = 0; # next record ptr $dstore->{tags} = $sfmap->tags; # list of all tags $self->{data} = $dstore; @@ -84,8 +79,6 @@ sub new { return $self; } -sub DESTROY { unlink "EMMXSSTORAGE.dbmd" } - =head2 parse_record Extracts data from the next record, per the mapping file. @@ -105,7 +98,7 @@ sub parse_record { $reccount++; # check for required fields - check_required(); + check_required($crec); push @{ $dstore->{recs} }, $crec; print STDERR "$reccount\n" @@ -136,8 +129,9 @@ sub process_field { { process_subs($tag, $sub, $crec) } # check map to ensure all declared tags and subs have a value - my $mods = $sfmap->mods($field); for my $mappedsub ( @{ $sfmap->subfields($tag) } ) { + my $fieldname = $sfmap->field($tag, $mappedsub); + my $mods = $sfmap->mods($fieldname); next if $mods->{multi}; $crec->{tags}[-1]{uni}{$mappedsub} = '' unless defined $crec->{tags}[-1]{uni}{$mappedsub}; @@ -156,7 +150,7 @@ sub process_subs { # handle unmapped tag/subs return unless ($sfmap->has($tag, $code)); - # fetch our datafield struct and fieldname + # fetch our datafield struct and fiel my $dataf = $crec->{tags}[-1]; my $field = $sfmap->field($tag, $code); @@ -164,10 +158,12 @@ sub process_subs { for my $filter ( @{$sfmap->filters($field)} ) { return if ($sub->text =~ /$filter/i); } + # handle multi modifier if (my $mods = $sfmap->mods($field)) { if ($mods->{multi}) { push @{$dataf->{multi}{$code}}, $sub->text; + $multis->{$tag}{$code} = 1; return; } } @@ -182,8 +178,8 @@ sub process_subs { sub check_required { + my ($crec) = @_; my $mods = $sfmap->mods; - my $crec = $dstore->{crec}; for my $tag_id (keys %{$mods->{required}}) { for my $code (@{$mods->{required}{$tag_id}}) { @@ -219,6 +215,17 @@ Returns mapped fieldname when passed a tag, and code sub name { my ($self, $t, $c) = @_; return $sfmap->field($t, $c) } +=head2 get_multis + +Returns hashref of C<{tag}{code}> for all mapped multi fields + +=cut + +sub get_multis { + my ($self) = @_; + return $multis; +} + =head1 MODIFIERS MapDrivenMARCXMLProc implements the following modifiers, and passes