Browse Source

- minor mysql improvements
- proper postgres schema generator

Jan Janak 20 years ago
parent
commit
2796d2faa1

+ 44 - 1
doc/stylesheets/dbschema/xsl/mysql.xsl

@@ -6,6 +6,31 @@
 
     <xsl:import href="sql.xsl"/>
 
+    <xsl:template match="database">
+	<xsl:variable name="database.name">
+	    <xsl:call-template name="get-name"/>
+	</xsl:variable>
+
+	<xsl:text>CREATE DATABASE </xsl:text>
+	<xsl:value-of select="$database.name"/>
+	<xsl:text>;&#x0A;</xsl:text>
+
+	<xsl:text>USE </xsl:text>
+	<xsl:value-of select="$database.name"/>
+	<xsl:text>;&#x0A;&#x0A;</xsl:text>
+	<xsl:apply-imports/>
+    </xsl:template>
+
+    <xsl:template match="database" mode="drop">
+	<xsl:variable name="database.name">
+	    <xsl:call-template name="get-name"/>
+	</xsl:variable>
+
+	<xsl:text>DROP DATABASE </xsl:text>
+	<xsl:value-of select="$database.name"/>
+	<xsl:text>;&#x0A;</xsl:text>
+    </xsl:template>
+    
     <xsl:template name="table.close">
 	<xsl:text>)</xsl:text>
 	<xsl:if test="db:type">
@@ -26,30 +51,48 @@
 	    </xsl:when>
 	    <xsl:when test="$type='char'">
 		<xsl:text>TINYINT</xsl:text>
+		<xsl:call-template name="column.size"/>
+		<xsl:call-template name="column.trailing"/>
 	    </xsl:when>
 	    <xsl:when test="$type='short'">
 		<xsl:text>SMALLINT</xsl:text>
+		<xsl:call-template name="column.size"/>
+		<xsl:call-template name="column.trailing"/>
 	    </xsl:when>
 	    <xsl:when test="$type='int'">
 		<xsl:text>INT</xsl:text>
+		<xsl:call-template name="column.size"/>
+		<xsl:call-template name="column.trailing"/>
 	    </xsl:when>
 	    <xsl:when test="$type='long'">
 		<xsl:text>BIGINT</xsl:text>
+		<xsl:call-template name="column.size"/>
+		<xsl:call-template name="column.trailing"/>
 	    </xsl:when>
 	    <xsl:when test="$type='datetime'">
 		<xsl:text>DATETIME</xsl:text>
+		<xsl:call-template name="column.size"/>
+		<xsl:call-template name="column.trailing"/>
 	    </xsl:when>
 	    <xsl:when test="$type='double'">
 		<xsl:text>DOUBLE</xsl:text>
+		<xsl:call-template name="column.size"/>
+		<xsl:call-template name="column.trailing"/>
 	    </xsl:when>
 	    <xsl:when test="$type='float'">
 		<xsl:text>FLOAT</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>BLOB</xsl:text>
+		<xsl:call-template name="column.size"/>
+		<xsl:call-template name="column.trailing"/>
 	    </xsl:when>
 	    <xsl:otherwise>
 		<xsl:call-template name="type-error"/>
@@ -57,7 +100,7 @@
 	</xsl:choose>
     </xsl:template>
 
-    <xsl:template name="column.sign">
+    <xsl:template name="column.trailing">
 	<xsl:variable name="signed">
 	    <xsl:call-template name="get-sign"/>
 	</xsl:variable>

+ 135 - 1
doc/stylesheets/dbschema/xsl/postgres.xsl

@@ -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> (&#x0A;</xsl:text>
+
+	<!-- Process all columns -->
+	<xsl:apply-templates select="column"/>
+
+	<!-- Process all indexes -->
+	<xsl:apply-templates select="index[child::unique]"/>
+
+	<xsl:text>&#x0A;</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>,&#x0A;</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>&#x0A;</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>);&#x0A;</xsl:text>
+
+	<xsl:if test="position()=last()">
+	    <xsl:text>&#x0A;</xsl:text>
+	</xsl:if>
+    </xsl:template>
+
+</xsl:stylesheet>

+ 5 - 43
doc/stylesheets/dbschema/xsl/sql.xsl

@@ -19,37 +19,6 @@
 
 <!-- ################ DATABASE ################# -->
 
-    <xsl:template match="database">
-	<xsl:variable name="database.name">
-	    <xsl:call-template name="get-name"/>
-	</xsl:variable>
-
-	<xsl:text>CREATE DATABASE </xsl:text>
-	<xsl:value-of select="$database.name"/>
-	<xsl:text>;&#x0A;</xsl:text>
-
-	<xsl:text>USE </xsl:text>
-	<xsl:value-of select="$database.name"/>
-	<xsl:text>;&#x0A;&#x0A;</xsl:text>
-
-	<xsl:apply-imports/>
-    </xsl:template>
-
-    <xsl:template match="database" mode="drop">
-	<xsl:variable name="database.name">
-	    <xsl:call-template name="get-name"/>
-	</xsl:variable>
-
-	<xsl:text>USE </xsl:text>
-	<xsl:value-of select="$database.name"/>
-	<xsl:text>;&#x0A;&#x0A;</xsl:text>
-	<xsl:apply-templates mode="drop" select="table"/>
-	<xsl:text>&#x0A;</xsl:text>
-	<xsl:text>DROP DATABASE </xsl:text>
-	<xsl:value-of select="$database.name"/>
-	<xsl:text>;&#x0A;</xsl:text>
-    </xsl:template>
-    
 <!-- ################ /DATABASE ################# -->
 
     
@@ -78,16 +47,10 @@
 	<xsl:apply-templates select="row"/>
     </xsl:template>
 
-    <xsl:template match="table" mode="drop">
-	<xsl:text>DROP TABLE </xsl:text>
-	<xsl:call-template name="get-name"/>
-	<xsl:text>;&#x0A;</xsl:text>
-    </xsl:template>
-
     <xsl:template name="table.close">
 	<xsl:text>);&#x0A;&#x0A;</xsl:text>
     </xsl:template>
-
+    
 <!-- ################ /TABLE ################  -->
 
 <!-- ################ COLUMN ################  -->
@@ -99,10 +62,6 @@
 
 	<xsl:call-template name="column.type"/>
 
-	<xsl:call-template name="column.size"/>
-
-	<xsl:call-template name="column.sign"/>
-
 	<xsl:variable name="null">
 	    <xsl:call-template name="get-null"/>
 	</xsl:variable>
@@ -146,7 +105,10 @@
     </xsl:template>
 
     <xsl:template name="column.type">
+	<!-- FIXME -->
 	<xsl:call-template name="get-type"/>
+	<xsl:call-template name="column.size"/>
+	<xsl:call-template name="column.trailing"/>
     </xsl:template>
 
     <xsl:template name="column.size">
@@ -161,7 +123,7 @@
 	</xsl:if>
     </xsl:template>
 
-    <xsl:template name="column.sign"/>
+    <xsl:template name="column.trailing"/>
 
 <!-- ################ /COLUMN ################  -->