|
|
|
<?xml version="1.0" encoding="UTF-8"?>
|
|
|
|
<!-- Stylesheet zur Erzeugung eines DBConv Schemas aus kern.xml-->
|
|
|
|
<!-- MB 5.5.08-->
|
|
|
|
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
|
|
|
|
<xsl:import href="column.xsl" />
|
|
|
|
<xsl:import href="view.xsl" />
|
|
|
|
<xsl:param name="modul_pfad" />
|
|
|
|
<xsl:param name="dbsystem"/>
|
|
|
|
<xsl:param name="system">superx</xsl:param>
|
|
|
|
<!--<xsl:variable name="dbsystem">POSTGRES</xsl:variable>-->
|
|
|
|
<!--output method mit NAME text ist wichtig, damit sich result-document darauf beziehen kann-->
|
|
|
|
<xsl:output method="text" name="text"/>
|
|
|
|
<!-- dbconv erwartet Informix-Syntax wird für andere DB-System angepasst-->
|
|
|
|
<xsl:variable name="sx_client">psql</xsl:variable>
|
|
|
|
|
|
|
|
<xsl:template match="/">
|
|
|
|
<xsl:value-of select="$modul_pfad" />
|
|
|
|
<xsl:variable name="schema">
|
|
|
|
<xsl:choose>
|
|
|
|
<xsl:when test="$system='superx'">
|
|
|
|
<xsl:text>eduetl</xsl:text>
|
|
|
|
</xsl:when>
|
|
|
|
<xsl:otherwise>
|
|
|
|
<xsl:value-of select="$system"/>
|
|
|
|
</xsl:otherwise>
|
|
|
|
</xsl:choose>
|
|
|
|
</xsl:variable>
|
|
|
|
<xsl:for-each select="/module/database [ @system=$system]/table">
|
|
|
|
|
|
|
|
<xsl:call-template name="create_tables_schema" >
|
|
|
|
<xsl:with-param name="schema"><xsl:value-of select="$schema"/></xsl:with-param>
|
|
|
|
</xsl:call-template>
|
|
|
|
</xsl:for-each>
|
|
|
|
<xsl:for-each select="/module/database[ @system=$system]/views/view">
|
|
|
|
<xsl:call-template name="create_views_schema" >
|
|
|
|
<xsl:with-param name="schema"><xsl:value-of select="$schema"/></xsl:with-param>
|
|
|
|
</xsl:call-template>
|
|
|
|
</xsl:for-each>
|
|
|
|
<xsl:call-template name="create_foreign_keys">
|
|
|
|
<xsl:with-param name="schema"><xsl:value-of select="$schema"/></xsl:with-param>
|
|
|
|
</xsl:call-template>
|
|
|
|
|
|
|
|
</xsl:template>
|
|
|
|
|
|
|
|
<xsl:template name="create_tables_schema">
|
|
|
|
<xsl:param name="schema" />
|
|
|
|
<!-- start sql-file-->
|
|
|
|
<xsl:variable name="tabfile" select="concat($modul_pfad,'/conf/his1/dbconv/sch.',$schema,'/',@name,'.tab')"/>
|
|
|
|
Generiere <xsl:value-of select="$tabfile"/><xsl:text>
|
|
|
|
</xsl:text>
|
|
|
|
<!--output method mit NAME text ist wichtig, damit sich result-document darauf beziehen kann-->
|
|
|
|
<xsl:result-document href="{$tabfile}" format="text">
|
|
|
|
<xsl:text>{### </xsl:text><xsl:value-of select="@name"/><xsl:text> - automatisch generiert #########}
|
|
|
|
</xsl:text>
|
|
|
|
<xsl:variable name="table_name" select="@name" />
|
|
|
|
<xsl:text>create table </xsl:text><xsl:value-of select="@name" />
|
|
|
|
<xsl:text>(
|
|
|
|
</xsl:text><!-- Das Tabellenschema wird defaultmäßig für Informix erstellt, weil
|
|
|
|
HIS1-DBCONV das erwartet. Achtung: bei Views ist es umgekehrt -->
|
|
|
|
<xsl:variable name="column_str">
|
|
|
|
<xsl:call-template name="columnschema">
|
|
|
|
<xsl:with-param name="dbsystem" select="'INFORMIX'"/>
|
|
|
|
</xsl:call-template>
|
|
|
|
</xsl:variable>
|
|
|
|
<!--alles ist informix konform nur nicht default today, das versteht Postgres nicht-->
|
|
|
|
<xsl:value-of select="replace ($column_str,'default TODAY','default current_date')" />
|
|
|
|
<xsl:if test="$dbsystem='POSTGRES'">
|
|
|
|
<!-- add primary key, see ticket: #296420 -->
|
|
|
|
<xsl:call-template name="primary_key_pg">
|
|
|
|
<xsl:with-param name="table" select="$table_name"/>
|
|
|
|
</xsl:call-template>
|
|
|
|
</xsl:if>
|
|
|
|
<xsl:text>
|
|
|
|
);
|
|
|
|
</xsl:text>
|
|
|
|
<xsl:if test="@description != ''">
|
|
|
|
comment on table <xsl:value-of select="@name" /> is '<xsl:value-of select="description" />';
|
|
|
|
</xsl:if>
|
|
|
|
<xsl:for-each select="columns/column">
|
|
|
|
<xsl:if test="@description != ''">
|
|
|
|
<xsl:variable name="description_clean" select="replace(@description,',','_')" />
|
|
|
|
<xsl:variable name="description_clean" select="replace($description_clean,'\(','[')" />
|
|
|
|
<xsl:variable name="description_clean" select="replace($description_clean,'\)',']')" />
|
|
|
|
comment on column <xsl:value-of select="$table_name" />.<xsl:value-of select="@name" /> is '<xsl:value-of select="normalize-space($description_clean)" />';
|
|
|
|
</xsl:if>
|
|
|
|
</xsl:for-each>
|
|
|
|
</xsl:result-document>
|
|
|
|
<!-- end sql-file-->
|
|
|
|
<!-- start idx-file-->
|
|
|
|
<xsl:if test="count(indexes/index) >0">
|
|
|
|
<xsl:variable name="idxfile" select="concat($modul_pfad,'/conf/his1/dbconv/sch.',$schema,'/',@name,'.idx')"/>
|
|
|
|
Generiere <xsl:value-of select="$idxfile"/><xsl:text>
|
|
|
|
</xsl:text>
|
|
|
|
<!--output method mit NAME text ist wichtig, damit sich result-document darauf beziehen kann-->
|
|
|
|
<xsl:result-document href="{$idxfile}" format="text">
|
|
|
|
{### <xsl:value-of select="@name"/> - automatisch generiert ##############################################
|
|
|
|
}
|
|
|
|
<xsl:call-template name="primary_indexes" />
|
|
|
|
<xsl:for-each select="indexes/index"><xsl:call-template name="create_index" /> </xsl:for-each>
|
|
|
|
</xsl:result-document>
|
|
|
|
<!-- end idx-file-->
|
|
|
|
</xsl:if>
|
|
|
|
<!-- foreign keys bisher nicht als foreignKeys deinfiert, über dbforms data-integretiy ginge-->
|
|
|
|
</xsl:template>
|
|
|
|
|
|
|
|
|
|
|
|
<xsl:template name="create_views_schema" >
|
|
|
|
<xsl:param name="schema" />
|
|
|
|
|
|
|
|
<!-- start view-files-->
|
|
|
|
<xsl:variable name="viewfile" select="concat($modul_pfad,'/conf/his1/dbconv/view.',$schema,'/',@name,'.view')"/>
|
|
|
|
Generiere <xsl:value-of select="$viewfile"/><xsl:text>
|
|
|
|
</xsl:text>
|
|
|
|
<!--output method mit NAME text ist wichtig, damit sich result-document darauf beziehen kann-->
|
|
|
|
<xsl:result-document href="{$viewfile}" format="text">
|
|
|
|
<xsl:call-template name="create_view"/>
|
|
|
|
</xsl:result-document>
|
|
|
|
<!-- end view-file-->
|
|
|
|
</xsl:template>
|
|
|
|
|
|
|
|
<!-- start primary_index-->
|
|
|
|
<xsl:template name="primary_indexes">
|
|
|
|
<xsl:for-each select="primaryKeys/rs">
|
|
|
|
<xsl:if test="count(row) > 0 and count(row[1]/fld) > 0">
|
|
|
|
create unique index <xsl:value-of select="row[1]/fld[@name='pk_name']"/> on <xsl:value-of select="row[1]/fld[@name='table_name']"/>
|
|
|
|
<xsl:text> (</xsl:text>
|
|
|
|
<xsl:for-each select="row">
|
|
|
|
|
|
|
|
<xsl:value-of select="fld[@name ='column_name']" />
|
|
|
|
<xsl:if test="position() < last()">
|
|
|
|
<xsl:text>, </xsl:text>
|
|
|
|
</xsl:if>
|
|
|
|
|
|
|
|
</xsl:for-each>
|
|
|
|
<xsl:text>);
|
|
|
|
</xsl:text>
|
|
|
|
</xsl:if>
|
|
|
|
</xsl:for-each>
|
|
|
|
</xsl:template>
|
|
|
|
<!-- end primary index-->
|
|
|
|
|
|
|
|
<!-- start primary_key_pg-->
|
|
|
|
<xsl:template name="primary_key_pg">
|
|
|
|
<xsl:param name="table"/>
|
|
|
|
<xsl:variable name="first_row" select="primaryKeys/rs[1]/row[1]" />
|
|
|
|
<xsl:variable name="pkname" select="$first_row/fld[@name='pk_name']"/>
|
|
|
|
<xsl:for-each select="primaryKeys/rs">
|
|
|
|
<xsl:if test="count(row) > 0 and count(row[1]/fld) > 0">
|
|
|
|
<xsl:text>
, primary key (</xsl:text>
|
|
|
|
<xsl:for-each select="row">
|
|
|
|
<xsl:value-of select="fld[@name ='column_name']" />
|
|
|
|
<xsl:if test="position() < last()">
|
|
|
|
<xsl:text>, </xsl:text>
|
|
|
|
</xsl:if>
|
|
|
|
</xsl:for-each>
|
|
|
|
<xsl:text>)</xsl:text>
|
|
|
|
</xsl:if>
|
|
|
|
</xsl:for-each>
|
|
|
|
</xsl:template>
|
|
|
|
<!-- end primary_key_pg -->
|
|
|
|
|
|
|
|
<!-- start create_index vergl. /home/superx/db/conf/index.xsl , log ausgabe entfernt-->
|
|
|
|
<xsl:template name="create_index">
|
|
|
|
<xsl:text>create </xsl:text>
|
|
|
|
<xsl:if test="@type='unique'"><xsl:text> unique </xsl:text></xsl:if>
|
|
|
|
<xsl:text> index </xsl:text>
|
|
|
|
<xsl:value-of select="@name" /><xsl:text> on </xsl:text><xsl:value-of select="../../@name" />
|
|
|
|
<xsl:text> (</xsl:text>
|
|
|
|
<xsl:for-each select="index-column">
|
|
|
|
<xsl:value-of select="@name" />
|
|
|
|
<xsl:if test="position() < last()">
|
|
|
|
<xsl:text>, </xsl:text>
|
|
|
|
</xsl:if>
|
|
|
|
</xsl:for-each>
|
|
|
|
<xsl:text> );
|
|
|
|
</xsl:text>
|
|
|
|
</xsl:template>
|
|
|
|
<!-- end creat index-->
|
|
|
|
<!-- create foreign keys -->
|
|
|
|
<xsl:template name="create_foreign_keys">
|
|
|
|
<xsl:param name="schema" />
|
|
|
|
<xsl:for-each-group select="/module/database [ @system=$system]/data-integrity/relation[@createForeignKey='true']"
|
|
|
|
group-by="@to">
|
|
|
|
<xsl:variable name="tabname"><xsl:value-of select="current-grouping-key()" /></xsl:variable>
|
|
|
|
<xsl:variable name="tabfile" select="concat($modul_pfad,'/conf/his1/dbconv/sch.',$schema,'/',$tabname,'.fk')"/>
|
|
|
|
Generiere <xsl:value-of select="$tabfile"/><xsl:text>
|
|
|
|
</xsl:text>
|
|
|
|
<!--output method mit NAME text ist wichtig, damit sich result-document darauf beziehen kann-->
|
|
|
|
<xsl:result-document href="{$tabfile}" format="text">
|
|
|
|
<!--<xsl:text>{### </xsl:text><xsl:value-of select="$tabname"/><xsl:text> - automatisch generiert #########}
|
|
|
|
</xsl:text>-->
|
|
|
|
<xsl:for-each select="current-group()">
|
|
|
|
<xsl:variable name="fkname"><xsl:value-of select="concat('fk',current-grouping-key(),'_')" />
|
|
|
|
<xsl:for-each select="relation-column">
|
|
|
|
<xsl:value-of select="@to" />
|
|
|
|
<xsl:if test="position() != last()"><xsl:text>_</xsl:text></xsl:if>
|
|
|
|
</xsl:for-each>
|
|
|
|
</xsl:variable>
|
|
|
|
<xsl:text>alter table </xsl:text><xsl:value-of select="$tabname" />
|
|
|
|
<xsl:text> ADD CONSTRAINT </xsl:text><xsl:value-of select="$fkname" />
|
|
|
|
<xsl:text> FOREIGN KEY (</xsl:text>
|
|
|
|
<xsl:for-each select="relation-column">
|
|
|
|
<xsl:value-of select="@to" />
|
|
|
|
<xsl:if test="position() != last()"><xsl:text>, </xsl:text></xsl:if>
|
|
|
|
</xsl:for-each>
|
|
|
|
<xsl:text>) REFERENCES </xsl:text>
|
|
|
|
<xsl:value-of select="@from" />
|
|
|
|
<xsl:text>(</xsl:text>
|
|
|
|
<xsl:for-each select="relation-column">
|
|
|
|
<xsl:value-of select="@from" />
|
|
|
|
<xsl:if test="position() != last()"><xsl:text>, </xsl:text></xsl:if>
|
|
|
|
</xsl:for-each>
|
|
|
|
<xsl:text>) ;
|
|
|
|
</xsl:text>
|
|
|
|
</xsl:for-each>
|
|
|
|
</xsl:result-document>
|
|
|
|
<!-- end sql-file-->
|
|
|
|
</xsl:for-each-group>
|
|
|
|
</xsl:template>
|
|
|
|
<!--log methode überschrieben-->
|
|
|
|
<xsl:template name="log"><xsl:param name="msg"/></xsl:template>
|
|
|
|
</xsl:stylesheet>
|