/[webpac]/trunk2/all2all.pl
This is repository of my old source code which isn't updated any more. Go to git.rot13.org for current projects!
ViewVC logotype

Diff of /trunk2/all2all.pl

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 9 by dpavlin, Sat Jan 11 19:55:30 2003 UTC revision 164 by dpavlin, Sat Nov 22 22:04:05 2003 UTC
# Line 6  use Getopt::Std; Line 6  use Getopt::Std;
6  use Data::Dumper;  use Data::Dumper;
7  use XML::Simple;  use XML::Simple;
8  use Text::Unaccent 1.02;        # 1.01 won't compile on my platform,  use Text::Unaccent 1.02;        # 1.01 won't compile on my platform,
9  require Unicode::Map8;  use Text::Iconv;
10  use DBI;  use Config::IniFiles;
11    use Encode;
12    
13  my $config=XMLin(undef, forcearray => [ 'isis' ], forcecontent => 1);  $|=1;
 my $dbh = DBI->connect("DBI:Pg:dbname=webpac","","") || die $DBI::errstr; # FIX  
 # FIX; select relname from pg_class where relname like 'index_%' ;  
 $dbh->begin_work || die $dbh->errstr();  
14    
15  $dbh->do("delete from index_author") || die $dbh->errstr();  my $config_file = $0;
16  $dbh->do("delete from index_title") || die $dbh->errstr();  $config_file =~ s/\.pl$/.conf/;
17    die "FATAL: can't find configuration file '$config_file'" if (! -e $config_file);
18    
19    my $config;
20    
21    #use index_DBI;         # default DBI module for index
22    use index_DBI_cache;    # faster DBI module using memory cache
23    my $index;
24    
25  my %opts;  my %opts;
26    
# Line 27  my %opts; Line 32  my %opts;
32    
33  getopts('d:m:qs', \%opts);  getopts('d:m:qs', \%opts);
34    
35  my $db_dir = $opts{d} || "ps";  # FIX  my $path;       # this is name of database
36    
37  #die "usage: $0 -d [database_dir] -m [database1,database2] " if (! %opts);  Text::Iconv->raise_error(0);     # Conversion errors don't raise exceptions
38    
39    # this is encoding of all files on disk, including import_xml/*.xml file and
40    # filter/*.pm files! It will be used to store strings in perl internally!
41    my $codepage = 'ISO-8859-2';
42    
43    my $utf2cp = Text::Iconv->new('UTF-8',$codepage);
44    # this function will convert data from XML files to local encoding
45    sub x {
46            return $utf2cp->convert($_[0]);
47    }
48    
49  #print Dumper($config->{indexer});  # decode isis/excel or other import codepage
50  #print "-" x 70,"\n";  my $import2cp;
51    
52  # how to convert isis code page to UTF8?  # outgoing xml must be in UTF-8
53  my $isis_map = Unicode::Map8->new($config->{isis_codepage}) || die;  my $cp2utf = Text::Iconv->new($codepage,'UTF-8');
54    
55  sub isis2xml {  # mapping between data type and tag which specify
56    # format in XML file
57    my %type2tag = (
58            'isis' => 'isis',
59            'excel' => 'column',
60            'marc' => 'marc',
61            'feed' => 'feed'
62    );
63    
64    sub data2xml {
65    
66            use xmlify;
67    
68            my $type = shift @_;
69          my $row = shift @_;          my $row = shift @_;
70            my $add_xml = shift @_;
71            # needed to read values from configuration file
72            my $cfg = shift @_;
73            my $database = shift @_;
74    
75          my $xml;          my $xml;
         $xml->{db_dir} = [ $db_dir ];   # FIX remove?  
76    
77          sub isis_sf {          use parse_format;
78                  my $row = shift @_;  
79                  my $isis_id = shift @_;          my $html = "";          # html formatted display output
80                  my $subfield = shift @_;  
81                  if ($row->{$isis_id}->[0]) {          my %field_usage;        # counter for usage of each field
82                          my $sf = OpenIsis::subfields($row->{$isis_id}->[0]);  
83                          if (! defined $subfield || length($subfield) == 0) {          # sort subrouting using order="" attribute
84                                  # subfield list undef, empty or no defined subfields for this record          sub by_order {
85                                  my $all_sf = $row->{$isis_id}->[0];                  my $va = $config->{indexer}->{$a}->{order} ||
86                                  $all_sf =~ s/\^./ /g;   nuke definirions                          $config->{indexer}->{$a};
87                                  return $all_sf;                  my $vb = $config->{indexer}->{$b}->{order} ||
88                          } elsif ($sf->{$subfield}) {                          $config->{indexer}->{$b};
89                                  return $sf->{$subfield};  
90                          }                  return $va <=> $vb;
                 }  
91          }          }
92    
93          foreach my $field (keys %{$config->{indexer}}) {          foreach my $field (sort by_order keys %{$config->{indexer}}) {
94    
95                    $field=x($field);
96                    $field_usage{$field}++;
97    
                 my $display_data = "";  
98                  my $swish_data = "";                  my $swish_data = "";
99                  my $index_data = "";                  my $swish_exact_data = "";
100                    my $display_data = "";
101                    my $line_delimiter;
102    
103                    my ($swish,$display);
104    
105                    my $tag = $type2tag{$type} || die "can't find which tag to use for type $type";
106                    foreach my $x (@{$config->{indexer}->{$field}->{$tag}}) {
107    
108                            my $format = x($x->{content});
109                            my $delimiter = x($x->{delimiter}) || ' ';
110    
111                  foreach my $x (@{$config->{indexer}->{$field}->{isis}}) {                          my $repeat_off = 0;             # repeatable offset
112    
113                          my $display_tmp = "";                          my ($s,$se,$d,$i) = (1,0,1,0);  # swish, display default
                         my $swish_tmp = "";  
                         my $index_tmp = "";  
   
                         my $format = $x->{content};  
                         my $s = 1;      # swish only  
                         my $d = 1;      # display only  
                         my $i = 0;      # index only  
114                          $s = 0 if (lc($x->{type}) eq "display");                          $s = 0 if (lc($x->{type}) eq "display");
115                          $d = 0 if (lc($x->{type}) eq "swish");                          $d = 0 if (lc($x->{type}) eq "swish");
116                            $se = 1 if (lc($x->{type}) eq "swish_exact");
117                          ($s,$d,$i) = (0,0,1) if (lc($x->{type}) eq "index");                          ($s,$d,$i) = (0,0,1) if (lc($x->{type}) eq "index");
118  #print STDERR "## s: $s d: $d i: $i ## $format ##\n";    
119                          # parse format                          # what will separate last line from this one?
120                          my $prefix = "";                          if ($display_data && $x->{append} && $x->{append} eq "1") {
121                          if ($format =~ s/^([^\d]+)//) {                                  $line_delimiter = ' ';
122                                  $prefix = $1;                          } elsif ($display_data) {
123                          }                                  $line_delimiter = '<br/>';
124                          while ($format) {                          }
125                                  if ($format =~ s/^(\d\d\d)(\w?)//) {  
126                                          my $isis_tmp = isis_sf($row,$1,$2);                          # init vars so that we go into while...
127                                          if ($isis_tmp) {                          ($swish,$display) = (1,1);
128  #                                               $display_tmp .= $prefix . "/$1/$2/".$isis_tmp if ($d);  
129                                                  $display_tmp .= $prefix . $isis_tmp if ($d);                          # placeholder for all repeatable entries for index
130                                                  $swish_tmp .= $isis_tmp." " if ($s);                          my @index_data;
131                                                  $index_tmp .= $prefix . $isis_tmp if ($i);                          my $index_filter;
132  #print STDERR " $isis_tmp <--\n";  
133                                          }                          sub mkformat {
134                                          $prefix = "";                                  my $x = shift || die "mkformat needs tag reference";
135                                  } elsif ($format =~ s/^([^\d]+)//) {                                  my $data = shift || return;
136                                          $prefix = $1;                                  my $format_name = x($x->{format_name}) || return $data;
137                                    my $fmt = x($config->{format}->{$format_name}->{content}) || die "<format name=\"$format_name\"> is not defined!";
138                                    my $format_delimiter = x($x->{format_delimiter});
139                                    my @data;
140                                    if ($format_delimiter) {
141                                            @data = split(/$format_delimiter/,$data);
142                                    } else {
143                                            push @data,$data;
144                                    }
145    
146                                    if ($fmt) {
147                                            my $nr = scalar $fmt =~ s/%s/%s/g;
148                                            if (($#data+1) == $nr) {
149                                                    return sprintf($fmt,@data);
150                                            } else {
151                                                    print STDERR "mkformat: [$data] can't be split on [$format_delimiter] to $nr fields!\n";
152                                                    return $data;
153                                            }
154                                  } else {                                  } else {
155                                          print STDERR "WARNING: unparsed format '$format'\n";                                          print STDERR "usage of link '$format_name' without defined format (<link> tag)\n";
156                                    }
157                            }
158    
159                            # while because of repeatable fields
160                            while ($swish || $display) {
161                                    ($swish,$display) = parse_format($type, $format,$row,$repeat_off++,$import2cp);
162                                    if ($repeat_off > 1000) {
163                                            print STDERR "loop (more than 1000 repeatable fields) deteced in $row, $format\n";
164                                          last;                                          last;
165                                  };                                  }
166                                    
167                                    # filter="name" ; filter this field through
168                                    # filter/[name].pm
169                                    my $filter = $x->{filter};
170                                    if ($filter) {
171                                            require "filter/".$filter.".pm";
172                                    }
173                                    # type="swish" ; field for swish
174                                    if ($swish) {
175                                            if ($filter && ($s || $se)) {
176                                                    no strict 'refs';
177                                                    my $tmp = join(" ",&$filter($swish)) if ($s || $se);
178                                                    $swish_data .= $tmp if ($s);
179                                                    $swish_exact_data .= $tmp if ($se);
180    
181                                            } else {
182                                                    $swish_data .= $swish if ($s);
183                                                    $swish_exact_data .= $swish if ($se);
184                                            }
185                                    }
186    
187                                    # type="display" ; field for display
188                                    if ($d && $display) {
189                                            if ($line_delimiter && $display_data) {
190                                                    $display_data .= $line_delimiter;
191                                                    undef $line_delimiter;
192                                            }
193                                            if ($filter) {
194                                                    no strict 'refs';
195                                                    if ($display_data) {
196                                                            $display_data .= $delimiter.join($delimiter,mkformat($x,&$filter($display)));
197                                                    } else {
198                                                            $display_data = join($delimiter,mkformat($x,&$filter($display)));
199                                                    }
200                                            } else {
201                                                    if ($display_data) {
202                                                            $display_data .= $delimiter.mkformat($x,$display);
203                                                    } else {
204                                                            $display_data = mkformat($x,$display);
205                                                    }
206                                            }
207                                    }
208                                                    
209                                    # type="index" ; insert into index
210                                    if ($i && $display) {
211                                            push @index_data, $display;
212                                            $index_filter = $filter if ($filter);
213                                    }
214                            }
215    
216                            # fill data in index
217                            if (@index_data) {
218                                    if ($index_filter) {
219                                            no strict 'refs';
220                                            foreach my $d (@index_data) {
221                                                    $index->insert($field, &$index_filter($d), $path);
222                                            }
223                                    } else {
224                                            foreach my $d (@index_data) {
225                                                    $index->insert($field, $d, $path);
226                                            }
227                                    }
228                            }
229                    }
230    
231                    # now try to parse variables from configuration file
232                    foreach my $x (@{$config->{indexer}->{$field}->{'config'}}) {
233    
234                            my $delimiter = x($x->{delimiter}) || ' ';
235                            my $val = $cfg->val($database, x($x->{content}));
236    
237                            my ($s,$d,$i) = (1,1,0);        # swish, display default
238                            $s = 0 if (lc($x->{type}) eq "display");
239                            $d = 0 if (lc($x->{type}) eq "swish");
240                            # no support for swish exact in config.
241                            # IMHO, it's useless
242                            ($s,$d,$i) = (0,0,1) if (lc($x->{type}) eq "index");
243    
244                            if ($val) {
245                                    $display_data .= $delimiter.$val if ($d);
246                                    $swish_data .= $val if ($s);
247                                    $index->insert($field, $val, $path) if ($i);
248                          }                          }
249                          # add suffix  
250                          $display_tmp .= $prefix if ($display_tmp);                  }
251                          $index_tmp .= $prefix if ($index_tmp);  
252    
253  #                       $display_data .= $display_tmp if ($display_tmp ne "");                  if ($display_data) {
254  #                       $swish_data .= $swish_tmp if ($swish_tmp ne "");  
255                          $display_data .= $display_tmp;                          if ($field eq "headline") {
256                          $swish_data .= $swish_tmp;                                  $xml .= xmlify("headline", $display_data);
257                          $index_data .= $index_tmp;                          } else {
258    
259                  }                                  # find field name (signular, plural)
260  #print "--display:$display_data\n--swish:$swish_data\n";                                  my $field_name = "";
261                  #$xml->{$field."_display"} = $isis_map->tou($display_data)->utf8 if ($display_data);                                  if ($config->{indexer}->{$field}->{name_singular} && $field_usage{$field} == 1) {
262                  #$xml->{$field."_swish"} = unac_string($config->{isis_codepage},$swish_data) if ($swish_data);                                          $field_name = $config->{indexer}->{$field}->{name_singular}."#-#";
263                  $xml->{$field."_display" } = [ $isis_map->tou($display_data)->utf8 ] if ($display_data);                                  } elsif ($config->{indexer}->{$field}->{name_plural}) {
264                  $xml->{$field."_swish"} = [ unac_string($config->{isis_codepage},$swish_data) ] if ($swish_data);                                          $field_name = $config->{indexer}->{$field}->{name_plural}."#-#";
265                                    } elsif ($config->{indexer}->{$field}->{name}) {
266                  # index                                          $field_name = $config->{indexer}->{$field}->{name}."#-#";
267                  if ($index_data && $index_data ne "") {                                  } else {
268                          my $sql = "select $field from index_$field where upper($field)=upper(?)";                                          print STDERR "WARNING: field '$field' doesn't have 'name' attribute!";
269                          my $sth = $dbh->prepare($sql) || die $dbh->errstr();                                  }
270                          $sth->execute($index_data) || die "SQL: $sql; ".$dbh->errstr();                                  if ($field_name) {
271  #print STDERR "--->$index_data<---\n";                                          $html .= x($field_name);
272                          if (! $sth->fetchrow_hashref) {                                  }
273                                  my $sql = "insert into index_$field values (?)";                                  $html .= $display_data."###\n";
                                 my $sth = $dbh->prepare($sql) || die $dbh->errstr();  
 #print STDERR "$sql: $index_data<!----\n";  
                                 $sth->execute($index_data) || die "SQL: $sql; ".$dbh->errstr();  
274                          }                          }
275                  }                  }
276                    if ($swish_data) {
277                            # remove extra spaces
278                            $swish_data =~ s/ +/ /g;
279                            $swish_data =~ s/ +$//g;
280    
281                            $xml .= xmlify($field."_swish", unac_string($codepage,$swish_data));
282                    }
283    
284                    if ($swish_exact_data) {
285                            $swish_exact_data =~ s/ +/ /g;
286                            $swish_exact_data =~ s/ +$//g;
287    
288                            # add delimiters before and after word.
289                            # That is required to produce exact match
290                            $xml .= xmlify($field."_swish_exact", unac_string($codepage,'xxbxx '.$swish_exact_data.' xxexx'));
291                    }
292    
293    
294          }          }
295    
296            # dump formatted output in <html>
297            if ($html) {
298                    #$xml .= xmlify("html",$html);
299                    $xml .= "<html><![CDATA[ $html ]]></html>";
300            }
301            
302          if ($xml) {          if ($xml) {
303                  return XMLout($xml, rootname => 'xml', keeproot => 0, noattr => 0 );                  $xml .= $add_xml if ($add_xml);
304                    return "<xml>\n$xml</xml>\n";
305          } else {          } else {
306                  return;                  return;
307          }          }
# Line 145  sub isis2xml { Line 309  sub isis2xml {
309    
310  ##########################################################################  ##########################################################################
311    
312  my $last_tell=0;  # read configuration for this script
313    my $cfg = new Config::IniFiles( -file => $config_file );
314    
315  my @isis_dirs = ( '.' );        # use dirname as database name  # read global.conf configuration
316    my $cfg_global = new Config::IniFiles( -file => 'global.conf' );
317    
318  if ($opts{m}) {  # open index
319          @isis_dirs = split(/,/,$opts{m});  $index = new index_DBI(
320                    $cfg_global->val('global', 'dbi_dbd'),
321                    $cfg_global->val('global', 'dbi_dsn'),
322                    $cfg_global->val('global', 'dbi_user'),
323                    $cfg_global->val('global', 'dbi_passwd') || '',
324            );
325    
326    my $show_progress = $cfg_global->val('global', 'show_progress');
327    
328    my $unac_filter = $cfg_global->val('global', 'unac_filter');
329    if ($unac_filter) {
330            require $unac_filter;
331  }  }
332    
333  my @isis_dbs;  foreach my $database ($cfg->Sections) {
334    
335  foreach (@isis_dirs) {          my $type = lc($cfg -> val($database, 'type')) || die "$database doesn't have 'type' defined";
336          if (-e $config->{isis_data}."/$db_dir/$_/LIBRI") {          my $add_xml = $cfg -> val($database, 'xml');    # optional
337                  push @isis_dbs,$config->{isis_data}."/$db_dir/$_/LIBRI/LIBRI";  
338          }  print STDERR "reading ./import_xml/$type.xml\n";
339          if (-e $config->{isis_data}."/$db_dir/$_/PERI") {  
340                  push @isis_dbs,$config->{isis_data}."/$db_dir/$_/PERI/PERI";          # extract just type basic
341          }          my $type_base = $type;
342          if (-e $config->{isis_data}."/$db_dir/$_/AMS") {          $type_base =~ s/_.+$//g;
343                  push @isis_dbs,$config->{isis_data}."/$db_dir/$_/AMS/AMS";  
344            $config=XMLin("./import_xml/$type.xml", forcearray => [ $type2tag{$type_base}, 'config', 'format' ], forcecontent => 1);
345    
346            # output current progress indicator
347            my $last_p = 0;
348            sub progress {
349                    return if (! $show_progress);
350                    my $current = shift;
351                    my $total = shift || 1;
352                    my $p = int($current * 100 / $total);
353                    if ($p != $last_p) {
354                            printf STDERR ("%5d / %5d [%-51s] %-2d %% \r",$current,$total,"=" x ($p/2).">", $p );
355                            $last_p = $p;
356                    }
357          }          }
358          if (-e $config->{isis_data}."/$db_dir/$_/ARTI") {  
359  #               push @isis_dbs,$config->{isis_data}."/$db_dir/$_/ARTI/ARTI";          my $fake_dir = 1;
360            sub fakeprogress {
361                    return if (! $show_progress);
362                    my $current = shift @_;
363    
364                    my @ind = ('-','\\','|','/','-','\\','|','/', '-');
365    
366                    $last_p += $fake_dir;
367                    $fake_dir = -$fake_dir if ($last_p > 1000 || $last_p < 0);
368                    if ($last_p % 10 == 0) {
369                            printf STDERR ("%5d / %5s [%-51s]\r",$current,"?"," " x ($last_p/20).$ind[($last_p/20) % $#ind]);
370                    }
371          }          }
 }  
372    
373  print STDERR "FATAL: Can't find isis database.\nPerhaps isis_data (".$config->{isis_data}.") has wrong value?\n" if (! @isis_dbs);          # now read database
374    print STDERR "using: $type...\n";
375    
376            if ($type_base eq "isis") {
377    
378  my $db;                  my $isis_db = $cfg -> val($database, 'isis_db') || die "$database doesn't have 'isis_db' defined!";
379    
380  foreach my $isis_db (@isis_dbs) {                  $import2cp = Text::Iconv->new($config->{isis_codepage},$codepage);
381                    my $db = OpenIsis::open( $isis_db );
382    
383                    # check if .txt database for OpenIsis is zero length,
384                    # if so, erase it and re-open database
385                    sub check_txt_db {
386                            my $isis_db = shift || die "need isis database name";
387                            my $reopen = 0;
388    
389                            if (-e $isis_db.".TXT") {
390                                    print STDERR "WARNING: removing $isis_db.TXT OpenIsis database...\n";
391                                    unlink $isis_db.".TXT" || warn "FATAL: unlink error on '$isis_db.TXT': $!";
392                                    $reopen++;
393                            }
394                            if (-e $isis_db.".PTR") {
395                                    print STDERR "WARNING: removing $isis_db.PTR OpenIsis database...\n";
396                                    unlink $isis_db.".PTR" || warn "FATAL: unlink error on '$isis_db.PTR': $!";
397                                    $reopen++;
398                            }
399                            return OpenIsis::open( $isis_db ) if ($reopen);
400                    }
401    
402                    # EOF error
403                    if ($db == -1) {
404                            $db = check_txt_db($isis_db);
405                            if ($db == -1) {
406                                    print STDERR "FATAL: OpenIsis can't open zero size file $isis_db\n";
407                                    next;
408                            }
409                    }
410    
411          my $db = OpenIsis::open( $isis_db );                  # OpenIsis::ERR_BADF
412          if (0) {                  if ($db == -4) {
413  #       # FIX                          print STDERR "FATAL: OpenIsis can't find file $isis_db\n";
414  #       if (! $db ) {                          next;
415                  print STDERR "WARNING: can't open '$isis_db'\n";                  # OpenIsis::ERR_IO
416                  next ;                  } elsif ($db == -5) {
417          }                          print STDERR "FATAL: OpenIsis can't access file $isis_db\n";
418                            next;
419                    } elsif ($db < 0) {
420                            print STDERR "FATAL: OpenIsis unknown error $db with file $isis_db\n";
421                            next;
422                    }
423    
424          my $max_rowid = OpenIsis::maxRowid( $db );                  my $max_rowid = OpenIsis::maxRowid( $db );
425    
426          print STDERR "Reading database: $isis_db [$max_rowid rows]\n";                  # if 0 records, try to rease isis .txt database
427                    if ($max_rowid == 0) {
428                            # force removal of database
429                            $db = check_txt_db($isis_db);
430                            $max_rowid = OpenIsis::maxRowid( $db );
431                    }
432    
433          my $last_p = 0;                  print STDERR "Reading database: $isis_db [$max_rowid rows]\n";
434    
435                    my $path = $database;
436    
437                    for (my $row_id = 1; $row_id <= $max_rowid; $row_id++ ) {
438                            my $row = OpenIsis::read( $db, $row_id );
439                            if ($row && $row->{mfn}) {
440            
441                                    progress($row->{mfn}, $max_rowid);
442    
443                                    my $swishpath = $path."#".int($row->{mfn});
444    
445                                    if (my $xml = data2xml($type_base,$row,$add_xml,$cfg,$database)) {
446                                            $xml = $cp2utf->convert($xml);
447                                            use bytes;      # as opposed to chars
448                                            print "Path-Name: $swishpath\n";
449                                            print "Content-Length: ".(length($xml)+1)."\n";
450                                            print "Document-Type: XML\n\n$xml\n";
451                                    }
452                            }
453                    }
454                    # for this to work with current version of OpenIsis (0.9.0)
455                    # you might need my patch from
456                    # http://www.rot13.org/~dpavlin/projects/openisis-0.9.0-perl_close.diff
457                    OpenIsis::close($db);
458                    print STDERR "\n";
459    
460            } elsif ($type_base eq "excel") {
461                    use Spreadsheet::ParseExcel;
462                    use Spreadsheet::ParseExcel::Utility qw(int2col);
463                    
464                    $import2cp = Text::Iconv->new($config->{excel_codepage},$codepage);
465                    my $excel_file = $cfg -> val($database, 'excel_file') || die "$database doesn't have 'excel_file' defined!";
466    
467                    my $sheet = x($config->{sheet}) || die "no sheet in $type.xml";
468                    my $start_row = x($config->{start_row}) - 1 || die "no start_row in $type.xml";
469    
470                    my $oBook = Spreadsheet::ParseExcel::Workbook->Parse($excel_file) || die "can't open Excel file '$excel_file'";
471    
472                    my $sheet_nr = 0;
473                    foreach my $oWks (@{$oBook->{Worksheet}}) {
474                            #print STDERR "-- SHEET $sheet_nr:", $oWks->{Name}, "\n";
475                            last if ($oWks->{Name} eq $sheet);
476                            $sheet_nr++;
477                    }
478    
479  #       { my $row_id = 1;                  my $oWorksheet = $oBook->{Worksheet}[$sheet_nr];
480  # FIX          
481          for (my $row_id = 1; $row_id <= $max_rowid; $row_id++ ) {                  print STDERR "using sheet: ",$oWorksheet->{Name},"\n";
482                  my $row = OpenIsis::read( $db, $row_id );                  defined ($oWorksheet) || die "can't find sheet '$sheet' in $excel_file";
483                  if ($row && $row->{mfn}) {                  my $end_row = x($config->{end_row}) || $oWorksheet->{MaxRow};
484    
485                          # output current process indicator                  for(my $iR = $start_row ; defined $end_row && $iR <= $end_row ; $iR++) {
486                          my $p = int($row->{mfn} * 100 / $max_rowid);                          my $row;
487                          if ($p != $last_p) {                          for(my $iC = $oWorksheet->{MinCol} ; defined $oWorksheet->{MaxCol} && $iC <= $oWorksheet->{MaxCol} ; $iC++) {
488                                  printf STDERR ("%5d / %5d [%-51s] %-2d %% \r",$row->{mfn},$max_rowid,"=" x ($p/2).">", $p ) if (! $opts{q});                                  my $cell = $oWorksheet->{Cells}[$iR][$iC];
489                                  $last_p = $p;                                  if ($cell) {
490                          }                                          $row->{int2col($iC)} = $cell->Value;
491                                    }
                         if (my $xml = isis2xml($row)) {  
                                 my $path = $isis_db;  
                                 $path =~ s#$config->{isis_data}/*##g;  
                                 my $out = "Path-Name: $path#".$row->{mfn}."\n";  
                                 $out .= "Content-Length: ".(length($xml)+1)."\n";  
                                 $out .= "Document-Type: XML\n\n$xml\n";  
                                 print $out;  
492                          }                          }
493    
494                            progress($iR, $end_row);
495    
496    #                       print "row[$iR/$end_row] ";
497    #                       foreach (keys %{$row}) {
498    #                               print "$_: ",$row->{$_},"\t";
499    #                       }
500    #                       print "\n";
501    
502                            my $swishpath = $database."#".$iR;
503    
504                            next if (! $row);
505    
506                            if (my $xml = data2xml($type_base,$row,$add_xml,$cfg,$database)) {
507                                    $xml = $cp2utf->convert($xml);
508                                    use bytes;      # as opposed to chars
509                                    print "Path-Name: $swishpath\n";
510                                    print "Content-Length: ".(length($xml)+1)."\n";
511                                    print "Document-Type: XML\n\n$xml\n";
512                            }
513                    }
514            } elsif ($type_base eq "marc") {
515    
516                    use MARC;
517                    
518                    $import2cp = Text::Iconv->new($config->{marc_codepage},$codepage);
519                    my $marc_file = $cfg -> val($database, 'marc_file') || die "$database doesn't have 'marc_file' defined!";
520    
521                    # optional argument is format
522                    my $format = x($config->{format}) || 'usmarc';
523    
524                    print STDERR "Reading MARC file '$marc_file'\n";
525    
526                    my $marc = new MARC;
527                    my $nr = $marc->openmarc({
528                                    file=>$marc_file, format=>$format
529                            }) || die "Can't open MARC file '$marc_file'";
530    
531                    my $i=0;        # record nr.
532    
533                    my $rec;
534    
535                    while ($marc->nextmarc(1)) {
536    
537                            # XXX
538                            fakeprogress($i++);
539    
540                            my $swishpath = $database."#".$i;
541    
542                            if (my $xml = data2xml($type_base,$marc,$add_xml,$cfg,$database)) {
543                                    $xml = $cp2utf->convert($xml);
544                                    use bytes;      # as opposed to chars
545                                    print "Path-Name: $swishpath\n";
546                                    print "Content-Length: ".(length($xml)+1)."\n";
547                                    print "Document-Type: XML\n\n$xml\n";
548                            }
549                    }
550            } elsif ($type_base eq "feed") {
551    
552                    $import2cp = Text::Iconv->new($config->{feed_codepage},$codepage);
553                    my $prog = x($config->{prog}) || die "$database doesn't have 'prog' defined!";
554    
555                    print STDERR "Reading feed from program '$prog'\n";
556    
557                    open(FEED,"feeds/$prog |") || die "can't start $prog: $!";
558    
559                    my $i=1;        # record nr.
560    
561                    my $data;
562                    my $line=1;
563    
564                    while (<FEED>) {
565                            chomp;
566    
567                            if (/^$/) {
568                                    my $swishpath = $database."#".$i++;
569    
570                                    if (my $xml = data2xml($type_base,$data,$add_xml,$cfg,$database)) {
571                                            $xml = $cp2utf->convert($xml);
572                                            use bytes;      # as opposed to chars
573                                            print "Path-Name: $swishpath\n";
574                                            print "Content-Length: ".(length($xml)+1)."\n";
575                                            print "Document-Type: XML\n\n$xml\n";
576                                    }
577                                    $line = 1;
578                                    $data = {};
579                                    next;
580                            }
581    
582                            $line = $1 if (s/^(\d+):\s*//);
583                            $data->{$line++} = $_;
584    
585                            fakeprogress($i);
586    
587                  }                  }
588          }          }
         print STDERR "\n";  
589  }  }
590    
591  $dbh->commit || die $dbh->errstr();  # call this to commit index
592    $index->close;
593    
594  1;  1;
595  __END__  __END__
# Line 225  __END__ Line 597  __END__
597    
598  =head1 NAME  =head1 NAME
599    
600  isis2xml.pl - read isis file and dump XML  all2xml.pl - read various file formats and dump XML for SWISH-E
601    
602  =head1 DESCRIPTION  =head1 DESCRIPTION
603    
604  This command will read ISIS data file using OpenIsis perl module and  This command will read ISIS data file using OpenIsis perl module, MARC
605  create XML file for usage with I<SWISH-E>  records using MARC module and optionally Micro$oft Excel files to
606  indexer. Dispite it's name, this script B<isn't general xml generator>  create one XML file for usage with I<SWISH-E> indexer. Dispite it's name,
607  from isis files (isis allready has something like that). Output of this  this script B<isn't general xml generator> from isis files (isis allready
608  script is tailor-made for SWISH-E.  has something like that). Output of this script is tailor-made for SWISH-E.
609    
610    =head1 BUGS
611    
612    Documentation is really lacking. However, in true Open Source spirit, source
613    is best documentation. I even made considerable effort to comment parts
614    which are not intuitively clear, so...
615    
616  =head1 AUTHOR  =head1 AUTHOR
617    

Legend:
Removed from v.9  
changed lines
  Added in v.164

  ViewVC Help
Powered by ViewVC 1.1.26