<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet href="/pool/xslt_ht.xslt" type="application/xml"?>
<xsl:stylesheet
  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"
  exclude-result-prefixes = "xl"
>
<!--
  SQL-Skript zum Anlegen der Datenbank aus Datenbank-Dump
  2020-12-05 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_create.xslt</title>
  <subtitle>SQL-Skript zum Anlegen der Datenbank aus Datenbank-Dump</subtitle>
  <date>2020-12-05</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 SQL-Skript, das eine Datenbank gleicher Struktur anlegt.
</d:para>

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

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

<xsl:key name="index" match="dd:table/dd:index" use="concat (dd:tabname, '.', dd:key)"/>

<d:para>Wurzelelement: Datenbank anlegen</d:para>
<xsl:template match="/dd:dbdump">
  <xsl:variable name="dbname" select="dd:dbname"/>
  <xsl:text>-- automatisch erstellt </xsl:text>
  <xsl:if test="string-length ($p_date) &gt; 0">
    <xsl:value-of select="$p_date"/>
  </xsl:if>
  <xsl:text>
</xsl:text>
  <!-- CREATE DATABASE -->
  <xsl:choose>
    <xsl:when test="dd:create">
      <xsl:value-of select="dd:create"/>
    </xsl:when>
    <xsl:otherwise>
      <xsl:text>CREATE DATABASE IF NOT EXISTS </xsl:text>
      <xsl:value-of select="$dbname"/>
    </xsl:otherwise>
  </xsl:choose>
  <xsl:text>;
USE </xsl:text><xsl:value-of select="$dbname"/><xsl:text>;

</xsl:text>
  <xsl:apply-templates select="dd:table"/>
</xsl:template>

<d:para>Tabelle anlegen</d:para>
<xsl:template match="dd:table">
  <xsl:variable name="tnam" select="dd:tabname"/>
  <xsl:text>-- Tabelle </xsl:text>
  <xsl:value-of select="$tnam"/>
  <xsl:text>
</xsl:text>
  <xsl:choose>
    <xsl:when test="dd:create">
      <xsl:value-of select="dd:create"/>
    </xsl:when>
    <xsl:otherwise>
      <xsl:text>CREATE TABLE </xsl:text>
      <xsl:value-of select="$tnam"/>
      <xsl:text> (
  </xsl:text>
      <xsl:apply-templates select="dd:field"/>
      <xsl:apply-templates
        select = "
          dd:index [
          generate-id(.) = generate-id(key('index', concat (dd:tabname, '.', dd:key)))
          ]
        "
        mode = "index"
      />
      <xsl:text>)
    </xsl:text>
      <xsl:apply-templates select="dd:engine | dd:autoinc | dd:collate | dd:comment"/>
    </xsl:otherwise>
  </xsl:choose>
  <xsl:text>;

</xsl:text>
</xsl:template>

<d:para>Datenbank-Engine einer Tabelle</d:para>
<xsl:template match="dd:table/dd:engine">
  <xsl:text>ENGINE </xsl:text>
  <xsl:value-of select="."/>
  <xsl:if test="position() &lt; last()">
    <xsl:text>,
    </xsl:text>
  </xsl:if>
</xsl:template>

<d:para>Nächster Auto-Increment-Wert</d:para>
<xsl:template match="dd:table/dd:autoinc">
  <xsl:text>AUTO_INCREMENT </xsl:text>
  <xsl:value-of select="."/>
  <xsl:if test="position() &lt;last()">
    <xsl:text>,
    </xsl:text>
  </xsl:if>
</xsl:template>

<d:para>Sortierung</d:para>
<xsl:template match="dd:table/dd:collate">
  <xsl:text>COLLATE </xsl:text>
  <xsl:value-of select="."/>
  <xsl:if test="position() &lt; last()">
    <xsl:text>,
    </xsl:text>
  </xsl:if>
</xsl:template>

<d:para>Kommentar</d:para>
<xsl:template match="dd:table/dd:comment">
  <xsl:text>COMMENT `</xsl:text>
  <xsl:value-of select="."/>
  <xsl:text>`</xsl:text>
  <xsl:if test="position() &lt; last()">
    <xsl:text>,
    </xsl:text>
  </xsl:if>
</xsl:template>

<d:para>Ein Feld einer Tabelle</d:para>
<xsl:template match="dd:table/dd:field">
  <xsl:apply-templates select="dd:name"/>
  <xsl:apply-templates select="dd:type"/>
  <xsl:if test="not (dd:null)">
    <xsl:text>NOT NULL </xsl:text>
  </xsl:if>
  <xsl:apply-templates select="dd:default"/>
  <xsl:apply-templates select="dd:extra"/>
  <xsl:apply-templates select="dd:comment"/>
  <xsl:if test="position() &lt; last() or ../dd:index">
    <xsl:text>,</xsl:text>
  </xsl:if>
  <xsl:text>
  </xsl:text>
</xsl:template>

<d:para>Name eines Feldes</d:para>
<xsl:template match="dd:field/dd:name">
  <xsl:value-of select="."/>
  <xsl:text> </xsl:text>
</xsl:template>

<d:para>Datentyp eines Feldes</d:para>
<xsl:template match="dd:field/dd:type">
  <xsl:value-of select="."/>
  <xsl:text> </xsl:text>
</xsl:template>

<d:para>Defaultwert eines Feldes</d:para>
<xsl:template match="dd:field/dd:default">
  <xsl:text>DEFAULT `</xsl:text>
  <xsl:value-of select="."/>
  <xsl:text>` </xsl:text>
</xsl:template>

<d:para>Weitere Optionen zu einem Feld</d:para>
<xsl:template match="dd:field/dd:extra">
  <xsl:value-of select="."/>
  <xsl:text> </xsl:text>
</xsl:template>

<d:para>Kommentar zu einem Feld</d:para>
<xsl:template match="dd:field/dd:comment">
  <xsl:text>COMMENT `</xsl:text>
  <xsl:value-of select="."/>
  <xsl:text>` </xsl:text>
</xsl:template>

<d:para>Ein Index</d:para>
<xsl:template match="dd:table/dd:index" mode="index">
  <xsl:variable name="key" select="dd:key"/>
  <xsl:choose>
    <xsl:when test="dd:key = 'PRIMARY'">
      <xsl:text>PRIMARY KEY </xsl:text>
    </xsl:when>
    <xsl:when test="dd:nonuni">
      <xsl:value-of select="concat ('INDEX `', $key, '`')"/>
    </xsl:when>
    <xsl:otherwise>
      <xsl:value-of select="concat ('UNIQUE KEY `', $key, '`')"/>
    </xsl:otherwise>
  </xsl:choose>
  <xsl:apply-templates select="dd:ixtype"/>
  <xsl:text> (</xsl:text>
  <xsl:for-each select="../dd:index [dd:key = $key]">
    <xsl:sort select="dd:seq" data-type="number"/>
    <xsl:value-of select="concat ('`', dd:colname, '`')"/>
    <xsl:if test="position() &lt; last()">, </xsl:if>
  </xsl:for-each>
  <xsl:text>) </xsl:text>
  <xsl:apply-templates select="dd:ixcomm"/>
  <xsl:if test="position() &lt; last()">,</xsl:if>
  <xsl:text>
  </xsl:text>
</xsl:template>

<d:para>Typ eines Index</d:para>
<xsl:template match="dd:index/dd:ixtype">
  <xsl:value-of select="."/>
  <xsl:text> </xsl:text>
</xsl:template>

<d:para>Kommentar zu einem Index</d:para>
<xsl:template match="dd:index/dd:ixcomm">
  <xsl:text>COMMENT `</xsl:text>
  <xsl:value-of select="."/>
  <xsl:text>` </xsl:text>
</xsl:template>

</xsl:stylesheet>
