use strict;
use XML::Twig;
-use DBM::Deep;
use Equinox::Migration::SubfieldMapper 1.004;
=head1 VERSION
-Version 1.004
+Version 1.005
=cut
-our $VERSION = '1.004';
+our $VERSION = '1.005';
my $dstore;
my $sfmap;
-my @mods = qw( multi bib required );
+my @modlist = qw( multi ignoremulti bib required );
+my %allmods = ();
my $multis = {};
my $reccount;
my $verbose = 0;
# initialize map and taglist
die "Argument 'mapfile' must be specified\n" unless ($args{mapfile});
$sfmap = Equinox::Migration::SubfieldMapper->new( file => $args{mapfile},
- mods => \@mods );
+ mods => \@modlist );
# initialize datastore
- #die "Datastore file 'EMMXSSTORAGE.dbmd' already exists. Exiting.\n"
- # if (-e "EMMXSSTORAGE.dbmd");
- #$dstore = DBM::Deep->new( file => "EMMXSSTORAGE.dbmd",
- # max_buckets => 64,
- # #data_sector_size => 256,
- # autoflush => 0,
- # );
$dstore = {};
$reccount = 0; # next record ptr
$dstore->{tags} = $sfmap->tags; # list of all tags
# handle unmapped tag/subs
return unless ($sfmap->has($tag, $code));
- # fetch our datafield struct and fiel
+ # fetch our datafield struct and field and mods
my $dataf = $crec->{tags}[-1];
my $field = $sfmap->field($tag, $code);
+ $allmods{$field} = $sfmap->mods($field) unless $allmods{$field};
+ my $mods = $allmods{$field};
# test filters
for my $filter ( @{$sfmap->filters($field)} ) {
}
# handle multi modifier
- if (my $mods = $sfmap->mods($field)) {
- if ($mods->{multi}) {
- push @{$dataf->{multi}{$code}}, $sub->text;
- $multis->{$tag}{$code} = 1;
- return;
- }
+ if ($mods->{multi}) {
+ push @{$dataf->{multi}{$code}}, $sub->text;
+ $multis->{$tag}{$code} = 1;
+ return;
}
# if this were a multi field, it would be handled already. make sure its a singleton
die "Multiple occurances of a non-multi field: $tag$code at rec ",
- ($reccount + 1),"\n" if (defined $dataf->{uni}{$code});
+ ($reccount + 1),"\n" if (defined $dataf->{uni}{$code} and !$mods->{ignoremulti});
# everything seems okay
$dataf->{uni}{$code} = $sub->text;