# file KLEIDER/catalog/src/dbdump/DataInserter.pm # Daten aus einer Dump-XML-Datei in eine Datenbank einfügen # 2020-12-06 Herbert Schiemann # GPL Version 2 oder neuer package Herbaer::DataInserter ; use XML::SAX::ParserFactory; sub new { my ($class, $ns, $cb, $verb) = @_; $class = ref($class) || $class; $self = { "ns" => $ns, "cb" => $cb, # 0: erwarte Datenbank-Tag # 1: erwarte Tabelle # 2: erwarte Feld # 3: erwarte Felddaten "state" => 0, "row" => undef, "fld" => undef, "verbose" => $verb // 1, }; bless ($self, $class); $self -> {"parser"} = XML::SAX::ParserFactory -> parser (Handler => $self); return $self; } # new # SAX-Handler-Methoden sub start_element { my ($self, $el) = @_; my $st = $self -> {"state"}; if ($el -> {"NamespaceURI"} eq $self -> {"ns"}) { if ($st == 1) { $self -> {"row"} = {}; } elsif ($st == 2) { $self -> {"fld"} = ""; } } elsif ($st == 0) { return; } ++$self -> {"state"}; } # start_element sub characters { my ($self, $chr) = @_; if ($self -> {"state"} == 3) { $self -> {"fld"} .= $chr -> {"Data"}; } } # characters sub end_element { my ($self, $el) = @_; my $st = $self -> {"state"}; if ($el -> {"NamespaceURI"} eq $self -> {"ns"}) { if ($st == 2) { $self -> {"cb"} -> ($el -> {"LocalName"}, $self -> {"row"}); } elsif ($st == 3) { $self -> {"row"} -> {$el -> {"LocalName"}} = $self -> {"fld"}; } } --$self -> {"state"} if $st; } # end_element # Verarbeitet eine Datei sub parse_file { my ($self, $filename) = @_; my $fh; # Dateihandle if (open ($fh, "<", $filename)) { $self -> {"parser"} -> parse_file ($fh); close ($fh); } else { print STDERR "Kann Datei \"$filename\" nicht lesen\n" if $self -> {"verbose"}; } } # parse_file 1; # end of file KLEIDER/catalog/src/dbdump/DataInserter.pm