<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet href="/pool/xslt_ht.xslt" type="application/xml"?>
<xsl:stylesheet
  xmlns = "http://relaxng.org/ns/structure/1.0"
  xmlns:xsl = "http://www.w3.org/1999/XSL/Transform"
  xmlns:d = "http://herbaer.de/xmlns/20051201/doc"
  xmlns:dd = "http://herbaer.de/xmlns/20201201/dbdump"
  xmlns:xl = "http://www.w3.org/1999/xlink"
  version = "1.0"
>
<!--
  Perl-Skript zum Einfügen von Daten aus Datenbank-Dump
  2020-12-06 Herbert Schiemann <h.schiemann@herbaer.de>
  Borkener Str. 167, 46284 Dorsten, Deutschland
  GPL Version 2 oder neuer
  Jede Gewährleistung ist ausgeschlossen.
-->
<d:info xmlns="http://herbaer.de/xmlns/20051201/doc">
  <title>dump_insert.xslt</title>
  <subtitle>Perl-Skript zum Einfügen von Daten aus Datenbank-Dump</subtitle>
  <date>2020-12-06</date>
  <author>
    <personname>
      <firstname>Herbert</firstname>
      <surname>Schiemann</surname>
    </personname>
    <email>h.schiemann@herbaer.de</email>
  </author>
</d:info>

<d:para role="stylesheet">
Erzeugt aus den Angaben zur Datenbank-Struktur in einer Datenbank-Dump-Datei
ein Perl-Skript, das die Datenbank-Inhalte aus der (einer) Dump-Datei
in eine Datenbank (gleicher Struktur) einfügt.
</d:para>

<d:para>Erstellungszeit</d:para>
<xsl:param name="p_date"/>

<xsl:output method="text" encoding="utf-8"/>

<d:para>Name der Datenbank</d:para>
<xsl:variable name="g_dbname" select="/dd:dbdump/dd:dbname"/>

<d:para>Wurzelelement: Skript ausgeben</d:para>
<xsl:template match="/dd:dbdump">
  <xsl:text>#!/usr/bin/perl -w
# file KLEIDER/catalog/dbdump/</xsl:text>
  <xsl:value-of select="$g_dbname"/>
  <xsl:text>_insert.pl generated </xsl:text>
  <xsl:value-of select="$p_date"/>
  <xsl:text>

use Cwd qw(realpath);
use Herbaer::DataInserter ;
use Herbaer::MysqlAccess ;
use Herbaer::Readargs;
use MIME::Base64;
use utf8;

binmode (STDIN,  ":encoding(utf-8)");
binmode (STDOUT, ":encoding(utf-8)");
binmode (STDERR, ":encoding(utf-8)");

my $args = {
   "[cnt]verbose" =&gt; 1,
   "dbkey"        =&gt; undef,
   "dumpfile"     =&gt; undef,
};

sub version {
   print &lt;&lt;'VERSION' ;
Daten aus einer Dump-XML-Datei in eine Datenbank einfügen
automatisch erstellt durch dump_insert.xslt </xsl:text>
  <xsl:value-of select="$p_date"/>
  <xsl:text>
VERSION
}
$args -&gt; {"[sr]version"} = sub { version (); exit 0; };

$args -&gt; {"[sr]help"} = sub {
   version ();
   print_message_with_values (&lt;&lt;"HELP", $args);
$0 OPTION...
--[no_]verbose      Umfang der Ausgabe \${[cnt]verbose}
--dbkey    DBKEY    Schlüssel zum Datenbankzugang \${dbkey}
--dumpfile DUMPFILE Pfad der Dump-Datei
                    \${dumpfile}
HELP
   exit 0;
};

read_args   ($args);

if (!$args -&gt; {"dumpfile"} || !$args -&gt; {"dbkey"}) {
   $args -&gt; {"[sr]help"} -&gt; ($args);
   exit 1;
}

my $dbh = get_database ($args -&gt; {"dbkey"});
exit unless $dbh;
$dbh = $dbh -&gt; [0];
</xsl:text>
  <xsl:apply-templates select="dd:table" mode="sth"/>
  <xsl:if test="//dd:type [contains (., 'blob') or contains (., 'binary')]">
sub dec_blob {
   my $v = shift;
   $v ? decode_base64 ($v) : $v;
}
  </xsl:if>
  <xsl:text>sub insert {
   my ($t, $v) = @_;
</xsl:text>
  <xsl:apply-templates select="dd:table" mode="exec"/>
  <xsl:text>}

Herbaer::DataInserter
   -&gt; new ("http://herbaer.de/xmlns/20201201/dbcontents/</xsl:text>
  <xsl:value-of select="$g_dbname"/>
  <xsl:text>", \&amp;insert, $args -&gt; {"[cnt]verbose"})
   -&gt; parse_file ($args -&gt; {"dumpfile"});

# end of file KLEIDER/catalog/dbdump/</xsl:text>
  <xsl:value-of select="$g_dbname"/>
  <xsl:text>_insert.pl generated_</xsl:text>
  <xsl:value-of select="$p_date"/>
  <xsl:text>
</xsl:text>
</xsl:template>

<d:para>
Statement-Handle für eine Tabelle
</d:para>
<xsl:template match="dd:table" mode="sth">
  <xsl:variable name="tnam" select="dd:tabname"/>
  <xsl:text>
my $st_</xsl:text>
  <xsl:value-of select="$tnam"/>
  <xsl:text> = $dbh -&gt; prepare (
  "INSERT INTO </xsl:text>
  <xsl:value-of select="$tnam"/><xsl:text> (</xsl:text>
  <xsl:apply-templates select="dd:field" mode="list"/>
  <xsl:text>) VALUES (</xsl:text>
  <xsl:apply-templates select="dd:field" mode="ph"/>
  <xsl:text>)"
   );
</xsl:text>
</xsl:template>

<d:para>Liste der Feldnamen</d:para>
<xsl:template match="dd:field" mode="list">
  <xsl:value-of select="dd:name"/>
  <xsl:if test="position() &lt; last()">, </xsl:if>
</xsl:template>

<d:para>Platzhalter für Werte</d:para>
<xsl:template match="dd:field" mode="ph">
  <xsl:text>?</xsl:text>
  <xsl:if test="position() &lt; last()">,</xsl:if>
</xsl:template>

<d:para>Datenzeile einfügen</d:para>
<xsl:template match="dd:table" mode="exec">
  <xsl:variable name="tnam" select="dd:tabname"/>
  <xsl:text>   </xsl:text>
  <xsl:if test="position() &lt; 1">els</xsl:if>
  <xsl:text>if ($t eq "</xsl:text>
  <xsl:value-of select="$tnam"/>
  <xsl:text>") {
      $st_</xsl:text>
  <xsl:value-of select="$tnam"/>
  <xsl:text> -&gt; execute (
</xsl:text>
  <xsl:apply-templates select="dd:field" mode="val"/>
  <xsl:text>      );
   }
</xsl:text>
</xsl:template>

<xsl:template match="dd:field" mode="val">
  <xsl:variable name="fn" select="dd:name"/>
  <xsl:choose>
    <xsl:when test="contains (dd:type, 'blob') or contains (dd:type, 'binary')">
      <xsl:text>         dec_blob ($v -&gt; {"</xsl:text>
      <xsl:value-of select="$fn"/>
      <xsl:text>"})</xsl:text>
    </xsl:when>
    <xsl:otherwise>
      <xsl:text>         $v -&gt; {"</xsl:text>
      <xsl:value-of select="$fn"/>
      <xsl:text>"}</xsl:text>
    </xsl:otherwise>
  </xsl:choose>
  <xsl:text>,
</xsl:text>
</xsl:template>

</xsl:stylesheet>
