<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet href="/pool/rng_ht.xslt" type="application/xml"?>
<!-- file KLEIDER/catalog/src/dbdump/dbdump.rng -->
<!--
  Struktur und Inhalt einer Datenbank
  "http://herbaer.de/xmlns/20201201/dbdump"
  2020-12-02 Herbert Schiemann <h.schiemann@herbaer.de>
  Borkener Str. 167, 46284 Dorsten, Germany
  GPL Version 2 oder neuer
  Jede Gewährleistung ist ausgeschlossen.

  Das Schema folgt den folgenden Richtlinien:
  - Jedes Attribut und jedes Element wird in einem
    <define>-Element spezifiziert
  - Jedes <define>-Element spezifiziert höchstens ein Attribut oder Element
  - Die Namen der Muster ("Pattern"), die ein Attribut spezifizieren,
    beginnen mit "att_".
  - Die Namen der Muster, die ein Element spezifizieren,
    beginnen mit "el_".
  - Die Dokumentation ist in den define-Elementen enthalten und benutzt
    DocBook-XML-artige Markierungen des Namensraums
    http://herbaer.de/xmlns/20051201/doc
-->
<grammar
  xmlns    = "http://relaxng.org/ns/structure/1.0"
  xmlns:d  = "http://herbaer.de/xmlns/20051201/doc"
  xmlns:xl = "http://www.w3.org/1999/xlink"
  ns       = "http://herbaer.de/xmlns/20201201/dbdump"
>

<d:info xmlns="http://herbaer.de/xmlns/20051201/doc">
  <title>dbdump.rng</title>
  <subtitle>Struktur und Inhalt einer Datenbank</subtitle>
  <date>2020-12-02</date>
  <author>
    <personname>
      <firstname>Herbert</firstname>
      <surname>Schiemann</surname>
    </personname>
    <email>h.schiemann@herbaer.de</email>
  </author>
</d:info>

<start>
  <ref name = "el_dbdump"/>
</start>

<define name = "anything">
  <d:para>
    Beliebiger Inhalt
  </d:para>
  <zeroOrMore>
    <choice>
      <element>
        <anyName/>
        <ref name="anything"/>
      </element>
      <attribute>
        <anyName/>
      </attribute>
      <text/>
    </choice>
  </zeroOrMore>
</define><!-- anything -->

<define name = "foreign_att">
  <d:para>
    Attribute anderer XML-Namensräume
  </d:para>
  <zeroOrMore>
    <attribute>
      <anyName>
        <except>
          <nsName ns = ""/>
          <nsName ns = "http://herbaer.de/xmlns/20201201/dbdump"/>
        </except>
      </anyName>
    </attribute>
  </zeroOrMore>
</define><!-- foreign_att -->

<define name = "foreign_el">
  <d:para>
    Elemente anderer XML-Namensräume
  </d:para>
  <zeroOrMore>
    <element>
      <anyName>
        <except>
          <nsName ns = "http://herbaer.de/xmlns/20201201/dbdump"/>
        </except>
      </anyName>
      <ref name = "anything"/>
    </element>
  </zeroOrMore>
</define><!-- foreign_el -->

<define name = "el_dbdump">
  <d:para>
Das XML-Wurzelelement des Dokuments
  </d:para>
  <d:para>
Es enthält Daten zur Struktur und zum Inhalt einer MariaDB-Datenbank.
Die hier definierten Elemente beschreiben im wesentlichen
die Struktur einer Datenbank: die Tabellen, die Felder und Indizes.
  </d:para>
  <element name = "dbdump">
    <ref name = "foreign_att"/>
    <interleave>
      <ref name = "el_dbname"/>
      <optional>
        <ref name = "el_create"/>
      </optional>
      <oneOrMore>
        <ref name = "el_table"/>
      </oneOrMore>
      <optional>
        <ref name = "el_contents"/>
      </optional>
      <ref name = "foreign_el"/>
    </interleave>
  </element>
</define><!-- el_dbdump -->

<define name = "el_dbname">
  <d:para>
Der Name der Datenbank    
  </d:para>
  <element name = "dbname">
    <ref name = "foreign_att"/>
    <data type = "word"/>
  </element>
</define>

<define name = "el_create">
  <d:para>
Eine SQL-Anweisung, die die Datenbank anlegt.
Sie ist das Ergebnis des SQL-Befehls <d:code>SHOW CREATE DATABASE</d:code>.
Siehe <d:uri xl:href = "https://mariadb.com/kb/en/show-create-database/"
>https://mariadb.com/kb/en/show-create-database/</d:uri>
  </d:para>
  <element name = "create">
    <ref name = "foreign_att"/>
    <text/>
  </element>
</define><!-- el_create -->

<define name = "el_table">
  <d:para>
Beschreibt eine Tabelle.
  </d:para>
  <d:para>
Die Elemente entsprechen den Zeilen der Ausgabe des SQL-Befehls
<d:code>SHOW FULL TABLES</d:code>, siehe
<d:uri xl:href = "https://mariadb.com/kb/en/show-tables/"
>https://mariadb.com/kb/en/show-tables/</d:uri>
  </d:para>
  <element name = "table">
    <ref name = "foreign_att"/>
    <interleave>
      <ref name = "el_tabname"/>
      <optional>
        <ref name = "el_tabtype"/>
      </optional>
      <optional>
        <ref name = "el_tab_create"/>
      </optional>
      <optional>
        <ref name = "el_tab_engine"/>
      </optional>
      <optional>
        <ref name = "el_tab_version"/>
      </optional>
      <optional>
        <ref name = "el_tab_rows"/>
      </optional>
      <optional>
        <ref name = "el_tab_datalen"/>
      </optional>
      <optional>
        <ref name = "el_tab_ixlen"/>
      </optional>
      <optional>
        <ref name = "el_tab_df"/>
      </optional>
      <optional>
        <ref name = "el_tab_autoinc"/>
      </optional>
      <optional>
        <ref name = "el_tab_cretime"/>
      </optional>
      <optional>
        <ref name = "el_tab_updtime"/>
      </optional>
      <optional>
        <ref name = "el_tab_chktime"/>
      </optional>
      <optional>
        <ref name = "el_tab_collate"/>
      </optional>
      <optional>
        <ref name = "el_tab_creopt"/>
      </optional>
      <optional>
        <ref name = "el_tab_comment"/>
      </optional>
      <oneOrMore>
        <ref name = "el_field"/>
      </oneOrMore>
      <oneOrMore>
        <ref name = "el_index"/>
      </oneOrMore>
      <ref name = "foreign_el"/>
    </interleave>
  </element>
</define><!-- el_table -->

<define name = "el_tabname">
  <d:para>
Der Name einer Tabelle
  </d:para>
  <element name = "tabname">
    <ref name = "foreign_att"/>
    <data type = "word"/>
  </element>
</define><!-- el_tabname -->

<define name = "el_tabtype">
  <d:para>
Typ einer Tabelle
  </d:para>
  <element name = "tabtype">
    <ref name = "foreign_att"/>
    <choice>
      <value>BASE TABLE</value>
      <value>VIEW</value>
      <value>SEQUENCE</value>
    </choice>
  </element>
</define><!-- el_tabtype -->

<define name = "el_tab_create">
  <d:para>
SQL-Anweisung, die die Tabelle erzeugt.
Der SQL-Befehl <d:code>SHOW CREATE TABLE</d:code> ergibt diese Anweisung,
s. <d:uri xl:href = "https://mariadb.com/kb/en/show-create-table/"
>https://mariadb.com/kb/en/show-create-table/</d:uri>.
  </d:para>
  <element name = "create">
    <ref name = "foreign_att"/>
    <text/>
  </element>
</define><!-- el_tab_create -->

<define name = "el_tab_engine">
  <d:para>
Table storage engine
  </d:para>
  <element name = "engine">
    <ref name = "foreign_att"/>
    <text/>
  </element>
</define>

<define name = "el_tab_version">
  <d:para>
Version number from the table's .frm file.    
  </d:para>
  <element name = "version">
    <ref name = "foreign_att"/>
    <text/>
  </element>
</define>

<define name = "el_tab_rows">
  <d:para>
Number of rows in the table.
Some engines, such as XtraDB and InnoDB may store an estimate.    
  </d:para>
  <element name = "rows">
    <ref name = "foreign_att"/>
    <data type = "integer"/>
  </element>
</define>

<define name = "el_tab_datalen">
  <d:para>
For InnoDB/XtraDB, the index size, in pages, multiplied by the page size.
For Aria and MyISAM, length of the data file, in bytes.
For MEMORY, the approximate allocated memory.    
  </d:para>
  <element name = "datalen">
    <ref name = "foreign_att"/>
    <data type = "integer"/>
  </element>
</define>

<define name = "el_tab_ixlen">
  <d:para>
Length of the index file.
  </d:para>
  <element name = "ixlen">
    <ref name = "foreign_att"/>
    <data type = "integer"/>    
  </element>
</define>

<define name = "el_tab_df">
  <d:para>
Bytes allocated but unused.
For InnoDB tables in a shared tablespace,
the free space of the shared tablespace with small safety margin.
An estimate in the case of partitioned tables -
see the <d:literal>PARTITIONS</d:literal> table.
  </d:para>
  <element name = "df">
    <ref name = "foreign_att"/>
    <data type = "integer"/>
  </element>
</define>

<define name = "el_tab_autoinc">
  <d:para>
Der nächste <d:literal>AUTO_INCREMENT</d:literal>-Wert
  </d:para>
  <element name = "autoinc">
    <ref name = "foreign_att"/>
    <data type = "integer"/>
  </element>
</define>

<define name = "el_tab_cretime">
  <d:para>
Zeit, zu der die Tabelle angelegt wurde
  </d:para>
  <element name = "cretime">
    <ref name = "foreign_att"/>
    <data type = "datetime"/>    
  </element>
</define>

<define name = "el_tab_updtime">
  <d:para>
Time the table was last updated.
On Windows, the timestamp is not updated on update,
so MyISAM values will be inaccurate.
In InnoDB, if shared tablespaces are used, will be <d:literal>NULL</d:literal>,
while buffering can also delay the update,
so the value will differ from the actual time of the last
<d:literal>UPDATE</d:literal>, <d:literal>INSERT</d:literal>
or <d:literal>DELETE</d:literal>.
  </d:para>
  <element name = "updtime">
    <ref name = "foreign_att"/>
    <data type = "datetime"/>
  </element>
</define>

<define name = "el_tab_chktime">
  <d:para>
Time the table was last checked.
Not kept by all storage engines, in which case will be NULL.    
  </d:para>
  <element name = "chktime">
    <ref name = "foreign_att"/>
    <data type = "datetime"/>
  </element>
</define>

<define name = "el_tab_collate">
  <d:para>
Character set and collation.    
  </d:para>
  <element name = "collate">
    <ref name = "foreign_att"/>
    <data type = "string"/>
  </element>
</define>

<define name = "el_tab_creopt">
  <d:para>
Weitere Optionen zu <d:literal>CREATE TABLE</d:literal>.
  </d:para>
  <element name = "creopt">
    <ref name = "foreign_att"/>
    <text/>
  </element>
</define>

<define name = "el_tab_comment">
  <d:para>
Kommentar zum Anlegen der Tabelle
  </d:para>
  <element name = "comment">
    <ref name = "foreign_att"/>
    <text/>
  </element>
</define>

<define name = "el_field">
  <d:para>
Beschreibt ein Feld einer Tabelle.
  </d:para>
  <d:para>
Jedes Element entspricht einer Zeile der Ausgabe des SQL-Befehls
<d:code>SHOW FULL COLUMNS FROM tabname</d:code>,
s. <d:uri xl:href = "https://mariadb.com/kb/en/show-columns/"
>https://mariadb.com/kb/en/show-columns/</d:uri>.
  </d:para>
  <element name = "field">
    <ref name = "foreign_att"/>
    <interleave>
      <ref name = "el_field_name"/>
      <ref name = "el_field_type"/>
      <optional>
        <ref name = "el_field_collate"/>
      </optional>
      <optional>
        <ref name = "el_field_null"/>
      </optional>
      <optional>
        <ref name = "el_field_key"/>
      </optional>
      <optional>
        <ref name = "el_field_default"/>
      </optional>
      <optional>
        <ref name = "el_field_extra"/>
      </optional>
      <optional>
        <ref name = "el_field_comment"/>
      </optional>
      <optional>
        <ref name = "el_field_label"/>
      </optional>
      <ref name = "foreign_el"/>
    </interleave>
  </element>
</define>

<define name = "el_field_name">
  <d:para>
Der Name eines Feldes
  </d:para>
  <element name = "name">
    <ref name = "foreign_att"/>
    <data type = "word"/>
  </element>
</define>

<define name = "el_field_type">
  <d:para>
Der Datentyp eines Feldes in Kleinbuchstaben.
  </d:para>
  <element name = "type">
    <ref name = "foreign_att"/>
    <data type = "string"/>
  </element>
</define>

<define name = "el_field_collate">
  <d:para>
Die Sortierfolge für nicht-binäre Zeichenketten-Felder.
  </d:para>
  <element name = "collate">
    <ref name = "foreign_att"/>
    <data type = "word"/>
  </element>
</define>

<define name = "el_field_null">
  <d:para>
Dieses Element zeigt an, dass das Feld
auch keinen Wert (<d:code>NULL</d:code>) enthalten kann.
Der SQL-Befehl <d:code>SHOW FULL COLUMS</d:code> zeigt in diesem Fall
in der Spalte <d:literal>Null</d:literal> den Wert <d:literal>YES</d:literal>.
  </d:para>
  <element name = "null">
    <ref name = "foreign_att"/>
    <value>1</value>
  </element>
</define>

<define name = "el_field_key">
  <d:para>
Dieses Element zeigt an,
dass das Feld Bestandteil eines Index ist.
  </d:para>
  <d:variablelist>
    <d:varlistentry>
      <d:term><d:literal>p</d:literal></d:term>
      <d:listitem>
        <d:para>
Die Spalte ist Teil des primären Index.
        </d:para>
      </d:listitem>
    </d:varlistentry>
    <d:varlistentry>
      <d:term><d:literal>u</d:literal></d:term>
      <d:listitem>
        <d:para>
Das Feld ist die erste Komponente eines eindeutigen Index
und darf nicht <d:literal>NULL</d:literal> sein.
        </d:para>
      </d:listitem>
    </d:varlistentry>
    <d:varlistentry>
      <d:term><d:literal>m</d:literal></d:term>
      <d:listitem>
        <d:para>
Das Feld ist die erste Komponente eines nicht-eindeutigen Index
oder eines eindeutigen Index, der <d:literal>NULL</d:literal>-Werte
enthalten kann.
        </d:para>
      </d:listitem>
    </d:varlistentry>
  </d:variablelist>
  <element name = "key">
    <ref name = "foreign_att"/>
    <choice>
      <value>p</value>
      <value>u</value>
      <value>m</value>
    </choice>
  </element>
</define>

<define name = "el_field_default">
  <d:para>
Der Default-Wert des Feldes.
  </d:para>
  <element name = "default">
    <ref name = "foreign_att"/>
    <text/>
  </element>
</define>

<define name = "el_field_extra">
  <d:para>
Zusätzliche Information zum Feld.
Das Feld kann unter anderen Wörtern die folgenden Wörter enthalten:    
  </d:para>
  <d:variablelist>
    <d:varlistentry>
      <d:term><d:literal>auto_increment</d:literal></d:term>
      <d:listitem>
        <d:para>
Das Feld ist ein AUTO_INCREMENT - Feld.   
        </d:para>
      </d:listitem>
    </d:varlistentry>
    <d:varlistentry>
      <d:term><d:literal>persistent</d:literal></d:term>
      <d:listitem>
        <d:para>
Das Feld ist mit dem Schlüsselwort <d:literal>PERSISTENT</d:literal> angelegt.
        </d:para>
      </d:listitem>
    </d:varlistentry>
    <d:varlistentry>
      <d:term><d:literal>virtual</d:literal></d:term>
      <d:listitem>
        <d:para>
Das Feld ist mit dem Schlüsselwort <d:literal>VIRTUAL</d:literal> angelegt.
        </d:para>
      </d:listitem>
    </d:varlistentry>
    <d:varlistentry>
      <d:term><d:literal>current_timestamp</d:literal></d:term>
      <d:listitem>
        <d:para>
Das Feld ist ein Zeitstempel und wird automatisch bei jedem
Einfügen oder Aktualisieren aktualisiert.
        </d:para>
      </d:listitem>
    </d:varlistentry>
  </d:variablelist>
  <element name = "extra">
    <ref name = "foreign_att"/>
    <text/>
  </element>
</define>

<define name = "el_field_comment">
  <d:para>
Eine Anmerkung zum Feld
  </d:para>
  <element name = "comment">
    <ref name = "foreign_att"/>
    <text/>
  </element>
</define>

<define name = "el_field_label">
  <d:para>
Eine kurze Beschriftung des Feldes zur Ausgabe.
MariaDB kennt keine Spaltenbeschriftung,
daher ist dieses Element niemals in der Ausgabe des
Skripts <d:filename>dbdump.pl</d:filename> enthalten.
In einer MariaDB - Datenbank kann der Spaltenkommentar
als Spaltenbeschriftung dienen.
  </d:para>
  <element name = "label">
    <ref name = "foreign_att"/>
    <text/>
  </element>
</define>

<define name = "el_index">
  <d:para>
Die Index-Felder der Tabelle.
Jedes Element entspricht einer Zeile der Ausgabe des SQL-Befehls    
<d:code>SHOW INDEX FROM tabname</d:code>,
s. <uri xl:href = "https://mariadb.com/kb/en/show-index/"
>https://mariadb.com/kb/en/show-index/</uri>
  </d:para>
  <element name = "index">
    <ref name = "foreign_att"/>
    <interleave>
      <ref name = "el_index_tabname"/>
      <ref name = "el_index_key"/>
      <ref name = "el_index_seq"/>
      <ref name = "el_index_colname"/>
      <optional>
        <ref name = "el_index_ixtype"/>
      </optional>
      <optional>
        <ref name = "el_index_nonuni"/>
      </optional>
      <optional>
        <ref name = "el_index_collate"/>
      </optional>
      <optional>
        <ref name = "el_index_card"/>
      </optional>
      <optional>
        <ref name = "el_index_subpart"/>
      </optional>
      <optional>
        <ref name = "el_index_packed"/>
      </optional>
      <optional>
        <ref name = "el_index_null"/>
      </optional>
      <optional>
        <ref name = "el_index_comment"/>
      </optional>
      <optional>
        <ref name = "el_index_ixcomm"/>
      </optional>
      <ref name = "foreign_el"/>
    </interleave>
  </element>
</define>

<define name = "el_index_tabname">
  <d:para>
Der Name der Tabelle des Index-Feldes.    
  </d:para>
  <d:para>
Im Falle eines <d:literal>VIEW</d:literal> ist der Tabellenname
anders als der <d:literal>VIEW</d:literal>-Name.    
  </d:para>
  <element name = "tabname">
    <ref name = "foreign_att"/>
    <data type = "word"/>
  </element>
</define>

<define name = "el_index_key">
  <d:para>
Der Name des Index.
Der primäre Index hat immer den Namen <d:literal>PRIMARY</d:literal>.
  </d:para>
  <element name = "key">
    <ref name = "foreign_att"/>
    <data type = "word"/>
  </element>
</define>

<define name = "el_index_seq">
  <d:para>
Die Position des Feldes im Index, beginnend mit <d:literal>1</d:literal>.
  </d:para>
  <element name = "seq">
    <ref name = "foreign_att"/>
    <data type = "integer"/>
  </element>
</define>

<define name = "el_index_colname">
  <d:para>
Der Name des Feldes
  </d:para>
  <element name = "colname">
    <ref name = "foreign_att"/>
    <data type = "word"/>
  </element>
</define>

<define name = "el_index_ixtype">
  <d:para>
Typ des Index. Mögliche Werte sind
  </d:para>
  <d:simplelist>
    <d:member><d:literal>BTREE</d:literal></d:member>
    <d:member><d:literal>FULLTEXT</d:literal></d:member>
    <d:member><d:literal>HASH</d:literal></d:member>
    <d:member><d:literal>RTREE</d:literal></d:member>
  </d:simplelist>
  <element name = "ixtype">
    <ref name = "foreign_att"/>
    <choice>
      <value>BTREE</value>
      <value>FULLTEXT</value>
      <value>HASH</value>
      <value>RTREE</value>
    </choice>
  </element>
</define>

<define name = "el_index_nonuni">
  <d:para>
Dieses Element zeigt an,   
dass der Index nicht eindeutig ist.
  </d:para>
  <element name = "nonuni">
    <ref name = "foreign_att"/>
    <value>1</value>
  </element>
</define>

<define name = "el_index_collate">
  <d:para>
Sortierung nach der Spalte im Index
  </d:para>
  <d:variablelist>
    <d:varlistentry>
      <d:term><d:literal>A</d:literal></d:term>
      <d:listitem>
        <d:para>
Der Index ist nach aufsteigenden Werten in dieser Spalte sortiert.
        </d:para>
      </d:listitem>
    </d:varlistentry>
    <d:varlistentry>
      <d:term><d:literal>NULL</d:literal></d:term>
      <d:listitem>
        <d:para>
Der Index ist nicht nach dem Werten dieser Spalte sortiert.
        </d:para>
      </d:listitem>
    </d:varlistentry>
  </d:variablelist>
  <element name = "collate">
    <ref name = "foreign_att"/>
    <choice>
      <value>A</value>
      <value>NULL</value>
    </choice>
  </element>
</define>

<define name = "el_index_card">
  <d:para>
Geschätzte Zahl eindeutiger Werte in diesem Feld.
  </d:para>
  <element name = "card">
    <ref name = "foreign_att"/>
    <data type = "integer"/>
  </element>
</define>

<define name = "el_index_subpart">
  <d:para>
Die Anzahl der einbezogenen Zeichen des Feldes,
falls nicht der ganze Inhalt des Feldes in den Index einbezogen ist,
  </d:para>
  <element name = "subpart">
    <ref name = "foreign_att"/>
    <data type = "integer"/>
  </element>
</define>

<define name = "el_index_packed">
  <d:para>
Falls der Index gepackt ist,
gibt dieses Element an, wie der Index gepackt ist.
  </d:para>
  <element name = "packed">
    <ref name = "foreign_att"/>
    <text/>
  </element>
</define>

<define name = "el_index_null">
  <d:para>
Dieses Element zeigt an,
dass das Feld leer (<d:literal>NULL</d:literal>) sein kann.
  </d:para>
  <element name = "null">
    <ref name = "foreign_att"/>
    <value>1</value>
  </element>
</define>

<define name = "el_index_comment">
  <d:para>
Weitere Information zum Index
  </d:para>
  <element name = "comment">
    <ref name = "foreign_att"/>
    <text/>
  </element>
</define>

<define name = "el_index_ixcomm">
  <d:para>
Der Kommentar zum Anlegen des Index.
  </d:para>
  <element name = "ixcomm">
    <ref name = "foreign_att"/>
    <text/>
  </element>
</define>

<define name = "el_contents">
  <d:para>
Der Inhalt der Datenbank.
Die Elemente, die den Inhalt der Datenbank enthalten,
gehören zu einem Namensraum,
der für die Datenbank spezifisch ist.
  </d:para>
  <element name = "contents">
    <ref name = "foreign_att"/>
    <ref name = "foreign_el"/>
  </element>
</define>

</grammar>
<!-- end of file KLEIDER/catalog/src/dbdump/dbdump.rng -->
