SuperX-Kernmodul
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

488 lines
14 KiB

<?xml version="1.0" encoding="UTF-8" ?>
<!--
#(c) 2005 Daniel Quathamer
Änderungen
16.4.04 MB Erweiterung für HSQL insb. nativeaction HSQLDB wie INFORMIX
5.11.2004 DQ neue Action transferTable
13.9.2006 DQ nativeaction kann mit dependent_module-Tag umgehen
-->
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:dbi="http://www.his.de/Abt1/Interfaces/dbi_V1.0">
<xsl:import href="column.xsl" />
<xsl:import href="xsl_functions.xsl" />
<xsl:template name="sx_action">
<xsl:param name="dbsystem"/>
<xsl:param name="sx_client" />
<xsl:for-each select="loadtable">
<xsl:call-template name="loadtable">
<xsl:with-param name="dbsystem" select="$dbsystem"/>
</xsl:call-template>
</xsl:for-each>
<xsl:for-each select="transferTable">
<xsl:call-template name="transferTable">
<xsl:with-param name="dbsystem" select="$dbsystem"/>
</xsl:call-template>
</xsl:for-each>
<xsl:for-each select="nativeaction">
<xsl:call-template name="nativeaction">
<xsl:with-param name="dbsystem" select="$dbsystem"/>
</xsl:call-template>
</xsl:for-each>
</xsl:template>
<xsl:template name="nativeaction">
<xsl:param name="dbsystem"/>
<xsl:choose>
<xsl:when test="$dbsystem='POSTGRES' and @database='POSTGRES'">
<xsl:if test="@scriptfile != ''" >
<xsl:choose>
<xsl:when test="@logoff = 'true'" >
</xsl:when>
<xsl:otherwise>
<xsl:call-template name="log">
<xsl:with-param name="msg" select="concat('SQL-Script ',@scriptfile,' ausführen')" />
</xsl:call-template>
</xsl:otherwise>
</xsl:choose>
<xsl:text>
\! </xsl:text>
<xsl:call-template name="DOSQL" />
</xsl:if>
<xsl:if test="@sql != ''" >
<xsl:choose>
<xsl:when test="@logoff = 'true'" >
</xsl:when>
<xsl:otherwise>
<xsl:call-template name="log">
<xsl:with-param name="msg" select="concat('SQL-Ausdruck ',@sql,' ausführen')" />
</xsl:call-template>
</xsl:otherwise>
</xsl:choose>
<xsl:value-of select="@sql" />
<xsl:text>
</xsl:text>
</xsl:if>
</xsl:when>
<xsl:when test="($dbsystem='INFORMIX' and @database='INFORMIX') or ($dbsystem='HSQLDB' and @database='HSQLDB')">
<xsl:if test="@scriptfile != ''" >
<xsl:choose>
<xsl:when test="@logoff = 'true'" >
</xsl:when>
<xsl:otherwise>
<xsl:call-template name="log">
<xsl:with-param name="msg" select="concat('SQL-Script ',@scriptfile,' ausführen')" />
</xsl:call-template>
</xsl:otherwise>
</xsl:choose>
<xsl:text>
! </xsl:text><xsl:call-template name="DOSQL" />
</xsl:if>
<xsl:if test="@sql != ''" >
<xsl:choose>
<xsl:when test="@logoff = 'true'" >
</xsl:when>
<xsl:otherwise>
<xsl:call-template name="log">
<xsl:with-param name="msg" select="concat('SQL-Ausdruck ',@sql,' ausführen')" />
</xsl:call-template>
</xsl:otherwise>
</xsl:choose>
<xsl:value-of select="@sql" />
<xsl:text>
</xsl:text>
</xsl:if>
</xsl:when>
<xsl:when test="@sql !='' and @database=''">
<!--Kein DB-spezifisches Script -->
<xsl:choose>
<xsl:when test="@logoff = 'true'" >
</xsl:when>
<xsl:otherwise>
<xsl:call-template name="log">
<xsl:with-param name="msg" select="concat('SQL-Ausdruck ',@sql,' ausführen')" />
</xsl:call-template>
</xsl:otherwise>
</xsl:choose>
<xsl:value-of select="@sql" />
<xsl:text>
</xsl:text>
</xsl:when>
<xsl:when test="@scriptfile !='' and @database=''">
<xsl:choose>
<xsl:when test="@logoff = 'true'" >
</xsl:when>
<xsl:otherwise>
<xsl:call-template name="log">
<xsl:with-param name="msg" select="concat('Scriptfile ',@scriptfile,' ausführen')" />
</xsl:call-template>
</xsl:otherwise>
</xsl:choose>
<xsl:choose>
<xsl:when test="$dbsystem='INFORMIX'">
<xsl:text>
! </xsl:text><xsl:choose>
<xsl:when test="substring(@scriptfile,string-length(@scriptfile)-1,2)='.x'">
<xsl:call-template name="shellscript" />
</xsl:when>
<xsl:otherwise>
<xsl:call-template name="DOSQL" />
</xsl:otherwise>
</xsl:choose>
</xsl:when>
<xsl:when test="$dbsystem='POSTGRES'">
<xsl:text>
\! </xsl:text><xsl:choose>
<xsl:when test="substring(@scriptfile,string-length(@scriptfile)-1,2)='.x'">
<xsl:call-template name="shellscript" />
</xsl:when>
<xsl:otherwise>
<xsl:call-template name="DOSQL" />
</xsl:otherwise>
</xsl:choose>
</xsl:when>
<xsl:otherwise>
<!--Kein DB-spezifisches Script, geht nicht -->
<xsl:call-template name="log">
<xsl:with-param name="msg" select="concat('Warnung: Das Script ',@scriptfile,' kann nur ausgeführt werden, wenn $DBSYSTEM gesetzt ist.')" />
</xsl:call-template>
</xsl:otherwise>
</xsl:choose>
</xsl:when>
</xsl:choose>
</xsl:template>
<xsl:template name="loadtable">
<xsl:param name="dbsystem"/>
<xsl:call-template name="log">
<xsl:with-param name="msg" select="concat('Lade Tabelle ',@tabname)" />
</xsl:call-template>
<xsl:choose>
<xsl:when test="$dbsystem='POSTGRES'">
<xsl:choose>
<xsl:when test="@refresh='true' or @refresh='TRUE'">
<xsl:text>\! sx_auto_upload_table.x </xsl:text><xsl:value-of select="@tabname" /><xsl:text> </xsl:text><xsl:value-of select="file/@path" /><xsl:text>
</xsl:text>
</xsl:when>
<xsl:otherwise>
<xsl:text>\! sx_upload_records.x </xsl:text><xsl:value-of select="@tabname" /><xsl:text> </xsl:text><xsl:value-of select="file/@path" /><xsl:text>
</xsl:text>
</xsl:otherwise>
</xsl:choose>
</xsl:when>
<xsl:when test="$dbsystem='INFORMIX' or $dbsystem='HSQLDB'">
<xsl:choose>
<xsl:when test="@refresh='true' or @refresh='TRUE'">
<!--
<xsl:if test="contains(@tabname,'_neu')">
<xsl:call-template name="log">
<xsl:with-param name="msg" select="'Aus Performancegründen wird die Tabelle neu erzeugt.'" />
</xsl:call-template>
<xsl:text>!sx_create_table.x </xsl:text><xsl:value-of select="@tabname" /><xsl:text>
</xsl:text>
</xsl:if>-->
<xsl:text>!sx_auto_upload_table.x </xsl:text><xsl:value-of select="@tabname" /><xsl:text> </xsl:text><xsl:value-of select="file/@path" /><xsl:text>
</xsl:text>
</xsl:when>
<xsl:otherwise>
<xsl:text>!sx_upload_records.x </xsl:text><xsl:value-of select="@tabname" /><xsl:text> </xsl:text><xsl:value-of select="file/@path" /><xsl:text>
</xsl:text>
</xsl:otherwise>
</xsl:choose>
</xsl:when>
<xsl:otherwise>
<!--Keine Aktion -->
</xsl:otherwise>
</xsl:choose>
</xsl:template>
<xsl:template name="transferTable">
<xsl:param name="dbsystem"/>
<xsl:call-template name="log">
<xsl:with-param name="msg" select="concat('transferTable ',@src,' to ' ,@target)" />
</xsl:call-template>
<xsl:if test="@deletetarget='delete' ">
<xsl:choose>
<xsl:when test="$dbsystem='POSTGRES'">
<xsl:text>\! echo "Deleting Table </xsl:text><xsl:value-of select="@target" /><xsl:text>"
truncate table </xsl:text><xsl:value-of select="@target" /><xsl:text>;
vacuum full </xsl:text><xsl:value-of select="@target" /><xsl:text>;
</xsl:text>
</xsl:when>
<xsl:when test="$dbsystem='INFORMIX' or $dbsystem='HSQLDB'">
<xsl:text>
delete from </xsl:text><xsl:value-of select="@target" /><xsl:text>;
</xsl:text>
</xsl:when>
<xsl:otherwise>
</xsl:otherwise>
</xsl:choose>
</xsl:if>
<xsl:if test="@deletetarget='drop' ">
<xsl:text>! echo "Dropping Table </xsl:text><xsl:value-of select="@target" /><xsl:text>"
</xsl:text>
<xsl:choose>
<xsl:when test="$dbsystem='POSTGRES'">
<xsl:text>
\! sx_create_table.x </xsl:text><xsl:value-of select="@target" /><xsl:text>
</xsl:text>
</xsl:when>
<xsl:when test="$dbsystem='INFORMIX'">
<xsl:text>
! sx_create_table.x </xsl:text><xsl:value-of select="@target" /><xsl:text>
</xsl:text>
</xsl:when>
<xsl:otherwise>
<xsl:text>
delete from </xsl:text><xsl:value-of select="@target" /><xsl:text>;
</xsl:text>
</xsl:otherwise>
</xsl:choose>
</xsl:if>
<xsl:choose>
<xsl:when test="@mode='insert' ">
<!--<xsl:text>! echo "Transferring Table </xsl:text><xsl:value-of select="@src" /><xsl:text> to </xsl:text><xsl:value-of select="@target" /><xsl:text>"
</xsl:text>-->
<xsl:call-template name="simpleInsert" />
</xsl:when>
<xsl:when test="@mode='update,insert' ">
<!--Workbench WBCOPY -->
<xsl:text>WBCOPY
-mode=UPDATE,INSERT
-targettable=</xsl:text><xsl:value-of select="@target" /><xsl:text>
</xsl:text>
<!--source -->
<xsl:choose>
<xsl:when test="string-length(sourcequery) &gt; 1">
<xsl:text>-sourcequery="</xsl:text> <xsl:value-of select="sourcequery" /><xsl:text>"
</xsl:text>
</xsl:when>
<xsl:otherwise>
<xsl:text>-sourcetable=</xsl:text><xsl:value-of select="@src" /><xsl:text>
</xsl:text>
</xsl:otherwise>
</xsl:choose>
<!-- deletetarget-->
<xsl:choose>
<xsl:when test="@deletetarget='drop' or @deletetarget='delete'">
<xsl:text>-deletetarget='true'
</xsl:text>
</xsl:when>
<xsl:otherwise>
<xsl:text>-deletetarget='false'
</xsl:text>
</xsl:otherwise>
</xsl:choose>
<!--columns-->
<xsl:if test="string-length(columns) &gt; 1">
<xsl:text>-columns="</xsl:text> <xsl:value-of select="columns" /><xsl:text>"
</xsl:text>
</xsl:if>
<!--keycolumns-->
<xsl:if test="string-length(keycolumns) &gt; 1">
<xsl:text>-keycolumns="</xsl:text> <xsl:value-of select="keycolumns" /><xsl:text>"
</xsl:text>
</xsl:if>
<xsl:text>;
</xsl:text>
<!--Ende Workbench -->
</xsl:when>
</xsl:choose>
</xsl:template>
<xsl:template name="updateSequences">
<xsl:for-each select="/module/database/table">
<xsl:for-each select="columns/column">
<xsl:if test="@type = 'SERIAL' or @type='serial'">
<xsl:text>
select setval('</xsl:text><xsl:value-of select="concat(../../@name,'_',@name,'_seq')"/>
<xsl:text>', (select max(</xsl:text> <xsl:value-of select="@name"/><xsl:text>)
from </xsl:text><xsl:value-of select="../../@name"/><xsl:text>));
</xsl:text>
</xsl:if>
</xsl:for-each>
</xsl:for-each>
</xsl:template>
<xsl:template name="simpleInsert">
<xsl:call-template name="log">
<xsl:with-param name="msg" select="concat('insert ',@src,' into ' ,@target)" />
</xsl:call-template>
<xsl:text>
insert into </xsl:text><xsl:value-of select="@target" />
<xsl:if test="string-length(columns) &gt; 1">
<xsl:text> (
</xsl:text><xsl:value-of select="columns" /><xsl:text> )
</xsl:text>
</xsl:if>
<xsl:choose>
<xsl:when test="string-length(sourcequery) &gt; 1">
<xsl:text>
</xsl:text><xsl:value-of select="sourcequery" />
</xsl:when>
<xsl:otherwise>
<!--keine Query, Tabelle komplett -->
<xsl:text> select * from </xsl:text><xsl:value-of select="@src" /><xsl:text>
</xsl:text>
</xsl:otherwise>
</xsl:choose>
<xsl:text>
; </xsl:text>
</xsl:template>
<xsl:template name="transferRows">
<xsl:param name="dbsystem"/>
<xsl:param name="target"/>
<xsl:param name="src"/>
<xsl:call-template name="log">
<xsl:with-param name="msg" select="concat('TransferRows ',$src,' to ' ,$target)" />
</xsl:call-template>
<xsl:for-each select="/module/database/table">
<xsl:if test="@name=$src">
<xsl:text>
insert into </xsl:text><xsl:value-of select="$target" /><xsl:text>(
</xsl:text>
<xsl:call-template name="column_names" />
<xsl:text>)
select
</xsl:text>
<xsl:call-template name="column_names" />
<xsl:text>
from </xsl:text><xsl:value-of select="$src"/><xsl:text>;
</xsl:text>
</xsl:if>
</xsl:for-each>
<!--Bei Postgres muss bei serial-Feldern die Sequence aktualisiert werden -->
<xsl:for-each select="/module/database/table">
<xsl:if test="@name=$target">
<xsl:for-each select="columns/column">
<xsl:if test="@type = 'SERIAL' or @type='serial'">
<xsl:text>
select setval('</xsl:text><xsl:value-of select="concat($target,'_',@name,'_seq')"/>
<xsl:text>', (select max(</xsl:text> <xsl:value-of select="@name"/><xsl:text>)
from </xsl:text><xsl:value-of select="$target"/><xsl:text>));
</xsl:text>
</xsl:if>
</xsl:for-each>
</xsl:if>
</xsl:for-each>
</xsl:template>
<xsl:template name="DOSQL">
<xsl:variable name="cmd_prefix">
<!--Test auf dependent_module (z.B. für KENN-Modul) -->
<xsl:choose>
<xsl:when test="string-length(@dependent_module) &gt; 0">
<xsl:text>if [ "$</xsl:text><xsl:call-template name="ucase">
<xsl:with-param name="s1" select="@dependent_module"></xsl:with-param></xsl:call-template>
<xsl:text>_INSTALLED" != "" ]; then </xsl:text>
</xsl:when>
<xsl:otherwise>
<xsl:text></xsl:text>
</xsl:otherwise>
</xsl:choose>
</xsl:variable>
<xsl:variable name="cmd_post">
<xsl:choose>
<xsl:when test="string-length(@dependent_module) &gt; 0">
<xsl:text>; else echo "Script nicht ausgeführt"; fi
</xsl:text>
</xsl:when>
<xsl:otherwise>
<xsl:text>
</xsl:text>
</xsl:otherwise>
</xsl:choose>
</xsl:variable>
<!--jetzt der Befehl:-->
<xsl:value-of select="$cmd_prefix" /><xsl:text> DOSQL </xsl:text><xsl:value-of select="@scriptfile" />
<xsl:value-of select="$cmd_post" />
</xsl:template>
<xsl:template name="shellscript">
<xsl:variable name="cmd_prefix">
<!--Test auf dependent_module (z.B. für KENN-Modul) -->
<xsl:choose>
<xsl:when test="string-length(@dependent_module) &gt; 0">
<xsl:text>if [ "$</xsl:text><xsl:call-template name="ucase">
<xsl:with-param name="s1" select="@dependent_module"></xsl:with-param></xsl:call-template>
<xsl:text>_INSTALLED" != "" ]; then </xsl:text>
</xsl:when>
<xsl:otherwise>
<xsl:text></xsl:text>
</xsl:otherwise>
</xsl:choose>
</xsl:variable>
<xsl:variable name="cmd_post">
<xsl:choose>
<xsl:when test="string-length(@dependent_module) &gt; 0">
<xsl:text>; else echo "Script nicht ausgeführt"; fi
</xsl:text>
</xsl:when>
<xsl:otherwise>
<xsl:text>
</xsl:text>
</xsl:otherwise>
</xsl:choose>
</xsl:variable>
<!--jetzt der Befehl:-->
<xsl:value-of select="$cmd_prefix" /><xsl:text> </xsl:text><xsl:value-of select="@scriptfile" />
<xsl:value-of select="$cmd_post" />
</xsl:template>
<xsl:template name="finalize_customer_specific_script">
<xsl:param name="dbsystem"/>
<xsl:param name="type"/>
<xsl:variable name="modulname"><xsl:value-of select="/module/@name"/></xsl:variable>
<xsl:if test="$type !='system' and $type !='test'">
<xsl:choose>
<xsl:when test="$dbsystem='POSTGRES'">
<xsl:text>
\! </xsl:text>
</xsl:when>
<xsl:otherwise>
<xsl:text>
! </xsl:text>
</xsl:otherwise>
</xsl:choose>
<xsl:text>DOSQL $</xsl:text>
<xsl:choose><xsl:when test="/module/@name='kern'">
<xsl:text>SUPERX_DIR/db/install/</xsl:text>
</xsl:when>
<xsl:otherwise>
<xsl:call-template name="ucase">
<xsl:with-param name="s1" select="$modulname"/>
</xsl:call-template><xsl:text>_PFAD/</xsl:text>
</xsl:otherwise>
</xsl:choose>
<xsl:value-of select="$modulname"/><xsl:text>_</xsl:text><xsl:value-of select="$type"/><xsl:text>_custom.sql
</xsl:text>
</xsl:if>
</xsl:template>
</xsl:stylesheet>