use strict;
use XML::Twig;
-use DBM::Deep;
use Equinox::Migration::SubfieldMapper 1.004;
=head1 VERSION
-Version 1.002
+Version 1.005
=cut
-our $VERSION = '1.002';
+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",
- data_sector_size => 256,
- autoflush => 0,
- );
+ $dstore = {};
$reccount = 0; # next record ptr
$dstore->{tags} = $sfmap->tags; # list of all tags
$self->{data} = $dstore;
return $self;
}
-sub DESTROY { unlink "EMMXSSTORAGE.dbmd" }
-
=head2 parse_record
Extracts data from the next record, per the mapping file.
$reccount++;
# check for required fields
- check_required();
+ check_required($crec);
push @{ $dstore->{recs} }, $crec;
print STDERR "$reccount\n"
# 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;
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}}) {