|
@@ -7,5 +7,139 @@
|
|
|
|
|
|
<xsl:import href="sql.xsl"/>
|
|
|
|
|
|
-</xsl:stylesheet>
|
|
|
+ <xsl:template name="column.type">
|
|
|
+ <xsl:variable name="type">
|
|
|
+ <xsl:call-template name="get-type"/>
|
|
|
+ </xsl:variable>
|
|
|
+
|
|
|
+ <xsl:choose>
|
|
|
+ <xsl:when test="db:type">
|
|
|
+ <xsl:value-of select="normalize-space(db:type)"/>
|
|
|
+ </xsl:when>
|
|
|
+ <xsl:when test="$type='char'">
|
|
|
+ <xsl:text>SMALLINT</xsl:text>
|
|
|
+ </xsl:when>
|
|
|
+ <xsl:when test="$type='short'">
|
|
|
+ <xsl:text>SMALLINT</xsl:text>
|
|
|
+ </xsl:when>
|
|
|
+ <xsl:when test="$type='int'">
|
|
|
+ <xsl:text>INTEGER</xsl:text>
|
|
|
+ </xsl:when>
|
|
|
+ <xsl:when test="$type='long'">
|
|
|
+ <xsl:text>BIGINT</xsl:text>
|
|
|
+ </xsl:when>
|
|
|
+ <xsl:when test="$type='datetime'">
|
|
|
+ <xsl:text>TIMESTAMP</xsl:text>
|
|
|
+ </xsl:when>
|
|
|
+ <xsl:when test="$type='double'">
|
|
|
+ <xsl:text>DOUBLE PRECISION</xsl:text>
|
|
|
+ </xsl:when>
|
|
|
+ <xsl:when test="$type='float'">
|
|
|
+ <xsl:text>REAL</xsl:text>
|
|
|
+ <xsl:call-template name="column.size"/>
|
|
|
+ <xsl:call-template name="column.trailing"/>
|
|
|
+ </xsl:when>
|
|
|
+ <xsl:when test="$type='string'">
|
|
|
+ <xsl:text>VARCHAR</xsl:text>
|
|
|
+ <xsl:call-template name="column.size"/>
|
|
|
+ <xsl:call-template name="column.trailing"/>
|
|
|
+ </xsl:when>
|
|
|
+ <xsl:when test="$type='binary'">
|
|
|
+ <xsl:text>BYTEA</xsl:text>
|
|
|
+ <xsl:call-template name="column.size"/>
|
|
|
+ <xsl:call-template name="column.trailing"/>
|
|
|
+ </xsl:when>
|
|
|
+ <xsl:otherwise>
|
|
|
+ <xsl:call-template name="type-error"/>
|
|
|
+ </xsl:otherwise>
|
|
|
+ </xsl:choose>
|
|
|
+ </xsl:template>
|
|
|
+
|
|
|
+ <xsl:template name="column.trailing">
|
|
|
+ <xsl:variable name="column.type">
|
|
|
+ <xsl:call-template name="get-type"/>
|
|
|
+ </xsl:variable>
|
|
|
+
|
|
|
+ <xsl:if test="$column.type='datetime'">
|
|
|
+ <xsl:text> WITHOUT TIME ZONE</xsl:text>
|
|
|
+ </xsl:if>
|
|
|
+ </xsl:template>
|
|
|
+
|
|
|
+ <xsl:template match="table">
|
|
|
+ <xsl:variable name="table.name">
|
|
|
+ <xsl:call-template name="get-name"/>
|
|
|
+ </xsl:variable>
|
|
|
+
|
|
|
+ <xsl:text>CREATE TABLE </xsl:text>
|
|
|
+ <xsl:value-of select="$table.name"/>
|
|
|
+ <xsl:text> (
</xsl:text>
|
|
|
+
|
|
|
+ <!-- Process all columns -->
|
|
|
+ <xsl:apply-templates select="column"/>
|
|
|
+
|
|
|
+ <!-- Process all indexes -->
|
|
|
+ <xsl:apply-templates select="index[child::unique]"/>
|
|
|
+
|
|
|
+ <xsl:text>
</xsl:text>
|
|
|
|
|
|
+ <xsl:call-template name="table.close"/>
|
|
|
+
|
|
|
+ <xsl:for-each select="index[count(child::unique)=0]">
|
|
|
+ <xsl:call-template name="create_index"/>
|
|
|
+ </xsl:for-each>
|
|
|
+
|
|
|
+ <!-- Process initial rows of data -->
|
|
|
+ <xsl:apply-templates select="row"/>
|
|
|
+ </xsl:template>
|
|
|
+
|
|
|
+ <xsl:template match="index">
|
|
|
+ <xsl:variable name="index.name">
|
|
|
+ <xsl:call-template name="get-name"/>
|
|
|
+ </xsl:variable>
|
|
|
+
|
|
|
+ <xsl:if test="position()=1">
|
|
|
+ <xsl:text>,
</xsl:text>
|
|
|
+ </xsl:if>
|
|
|
+ <xsl:text> </xsl:text>
|
|
|
+ <xsl:if test="not($index.name='')">
|
|
|
+ <xsl:text>CONSTRAINT </xsl:text>
|
|
|
+ <xsl:value-of select="concat($index.name, ' ')"/>
|
|
|
+ </xsl:if>
|
|
|
+ <xsl:text>UNIQUE (</xsl:text>
|
|
|
+ <xsl:apply-templates select="colref"/>
|
|
|
+ <xsl:text>)</xsl:text>
|
|
|
+
|
|
|
+ <xsl:if test="not(position()=last())">
|
|
|
+ <xsl:text>,</xsl:text>
|
|
|
+ <xsl:text>
</xsl:text>
|
|
|
+ </xsl:if>
|
|
|
+ </xsl:template>
|
|
|
+
|
|
|
+ <xsl:template name="create_index">
|
|
|
+ <xsl:variable name="index.name">
|
|
|
+ <xsl:call-template name="get-name"/>
|
|
|
+ </xsl:variable>
|
|
|
+ <xsl:variable name="table.name">
|
|
|
+ <xsl:call-template name="get-name">
|
|
|
+ <xsl:with-param name="select" select="parent::table"/>
|
|
|
+ </xsl:call-template>
|
|
|
+ </xsl:variable>
|
|
|
+
|
|
|
+ <xsl:text>CREATE </xsl:text>
|
|
|
+ <xsl:if test="unique">
|
|
|
+ <xsl:text>UNIQUE </xsl:text>
|
|
|
+ </xsl:if>
|
|
|
+ <xsl:text>INDEX </xsl:text>
|
|
|
+ <xsl:value-of select="$index.name"/>
|
|
|
+ <xsl:text> ON </xsl:text>
|
|
|
+ <xsl:value-of select="$table.name"/>
|
|
|
+ <xsl:text> (</xsl:text>
|
|
|
+ <xsl:apply-templates select="colref"/>
|
|
|
+ <xsl:text>);
</xsl:text>
|
|
|
+
|
|
|
+ <xsl:if test="position()=last()">
|
|
|
+ <xsl:text>
</xsl:text>
|
|
|
+ </xsl:if>
|
|
|
+ </xsl:template>
|
|
|
+
|
|
|
+</xsl:stylesheet>
|