+
+ } elsif ($type_base eq "dbf") {
+
+ my $dbf_file = $cfg -> val($database, 'dbf_file') || die "$database doesn't have 'dbf_file' defined!";
+ my $dbf_codepage = $cfg -> val($database, 'dbf_codepage') || die "$database doesn't have 'dbf_codepage' defined!";
+ my $dbf_mapping = $cfg -> val($database, 'dbf_mapping') || die "$database doesn't have 'dbf_mapping' defined!";
+
+ $import2cp = Text::Iconv->new($dbf_codepage,$codepage);
+ require XBase;
+ my $db = new XBase $dbf_file;
+
+ if (! $db) {
+ print STDERR "ERROR: can't read DBF database: $dbf_file, skipping...\n";
+ next;
+ }
+
+ my $max_rowid = $db->last_record;
+
+ print STDERR "Reading database: $dbf_file [$max_rowid rows]\n";
+
+ my %dbf2iso;
+ foreach my $m (split(/[\n\r]+/,$dbf_mapping)) {
+ my ($col,$fld) = split(/\s+/,$m,2);
+ $dbf2iso{$col} = $fld;
+ }
+
+#print STDERR "## dbf2iso: ",Dumper(\%dbf2iso),"\n## /dbf2iso\n";
+
+ # bad, bad...
+ require "to_hash.pm";
+
+ foreach my $row_id (0 .. $max_rowid) {
+ my $dbf_row = $db->get_record_as_hash($row_id);
+ if ($dbf_row) {
+
+#print STDERR "## dbf_row: ",Dumper($dbf_row),"\n## /dbf_row\n";
+ # apply mapping from config file
+ # all unspecified records will get _ in
+ # front of them - _DELETE will be __DELETE
+ my $rec;
+ map {
+ my $new_fld = $dbf2iso{$_} || '_'.$_;
+ my $data = $dbf_row->{$_};
+ push @{ $rec->{$new_fld} }, $data if ($data && $data !~ /^(?:\s+|\$a\.|)$/);
+ } keys %{$dbf_row};
+#print STDERR "## rec: ",Dumper($rec),"\n## /rec\n";
+ my $row = to_hash($row_id+1, $rec);
+
+ $row->{mfn} = $row_id+1;
+ $row->{record} = $rec;
+
+#print STDERR "## row: ",Dumper($row),"\n## /row\n";
+ progress($row->{mfn}, $max_rowid);
+
+ my $swishpath = $path."#".int($row->{mfn});
+
+ if (my $xml = data2xml($type_base,$row,$add_xml,$cfg,$database)) {
+ $xml = $cp2utf->convert($xml);
+ use bytes; # as opposed to chars
+ print "Path-Name: $swishpath\n";
+ print "Content-Length: ".(length($xml)+1)."\n";
+ print "Document-Type: XML\n\n$xml\n";
+ }
+ }
+ }
+ print STDERR "\n";