safer MR mapping
[Evergreen.git] / Open-ILS / src / extras / import / update_marc.pl
1 #!/usr/bin/perl -w
2 use strict;
3 use XML::LibXML;
4 use Time::HiRes qw/time/;
5 use Getopt::Long;
6 use Data::Dumper;
7 use Error qw/:try/;
8 use open qw/:utf8/;
9
10 $|=1;
11
12 my ($userid,$sourceid,$rec_id,$entry_file,$id_tag) = (1,2,1,'marc_update.sql','//*[@tag="035"][1]');
13
14 GetOptions (    
15         "sourceid"              => \$sourceid,
16         "sql_output=s"          => \$entry_file,
17         "userid=i"              => \$userid,
18         "first=i"               => \$rec_id,
19         "id_tag_xpath=s"        => \$id_tag,
20 );
21
22 my $tcn_map;
23
24 open RE, ">$entry_file" or die "Can't open $entry_file!  $!\n";
25
26 print RE <<SQL;
27 BEGIN;
28 SQL
29
30 my $xact_id = time;
31
32 my $parser = XML::LibXML->new;
33
34 my $xml = '';
35 while ( $xml .= <STDIN> ) {
36         chomp $xml;
37         next unless $xml;
38
39         my $tcn = '';
40         my $success = 0;
41         try {
42                 my $doc = $parser->parse_string($xml);;
43                 my @nodes = $doc->documentElement->findnodes( $id_tag );
44                 for my $n (@nodes) {
45                         $tcn .= $n->textContent;
46                 }
47                 $tcn =~ s/^\s*(\.+)\s*/$1/o;
48                 $tcn =~ s/\s+/_/go;
49                 $success = 1;
50         } catch Error with {
51                 my $e = shift;
52                 warn $e;
53                 warn $xml;
54         };      
55         next unless $success;
56
57         $xml =~ s/\t/\\t/go;
58         $xml =~ s/'/''/go;
59
60         $tcn =~ s/^.*?(\w+)\s*$/$1/go;
61         
62         unless ($tcn) {
63                 warn "\nNo TCN found for rec # $rec_id\n";
64                 $xml = '';
65                 $rec_id++;
66                 next;
67         }
68
69         if (exists($$tcn_map{$tcn})) {
70                 warn "\n !! TCN $tcn already exists!\n";
71                 $xml = '';
72                 next;
73         }
74
75         print ".";
76         $$tcn_map{$tcn} = $rec_id;
77
78         print RE "UPDATE biblio.record_entry SET marc = E'$xml' where id = $rec_id;\n";
79
80         $rec_id++;
81         $xml = '';
82 }
83
84