Browse code

- minor mysql improvements - proper postgres schema generator

Jan Janak authored on 26/08/2005 21:27:50
Showing 3 changed files
... ...
@@ -6,6 +6,31 @@
6 6
 
7 7
     <xsl:import href="sql.xsl"/>
8 8
 
9
+    <xsl:template match="database">
10
+	<xsl:variable name="database.name">
11
+	    <xsl:call-template name="get-name"/>
12
+	</xsl:variable>
13
+
14
+	<xsl:text>CREATE DATABASE </xsl:text>
15
+	<xsl:value-of select="$database.name"/>
16
+	<xsl:text>;&#x0A;</xsl:text>
17
+
18
+	<xsl:text>USE </xsl:text>
19
+	<xsl:value-of select="$database.name"/>
20
+	<xsl:text>;&#x0A;&#x0A;</xsl:text>
21
+	<xsl:apply-imports/>
22
+    </xsl:template>
23
+
24
+    <xsl:template match="database" mode="drop">
25
+	<xsl:variable name="database.name">
26
+	    <xsl:call-template name="get-name"/>
27
+	</xsl:variable>
28
+
29
+	<xsl:text>DROP DATABASE </xsl:text>
30
+	<xsl:value-of select="$database.name"/>
31
+	<xsl:text>;&#x0A;</xsl:text>
32
+    </xsl:template>
33
+    
9 34
     <xsl:template name="table.close">
10 35
 	<xsl:text>)</xsl:text>
11 36
 	<xsl:if test="db:type">
... ...
@@ -26,30 +51,48 @@
26 51
 	    </xsl:when>
27 52
 	    <xsl:when test="$type='char'">
28 53
 		<xsl:text>TINYINT</xsl:text>
54
+		<xsl:call-template name="column.size"/>
55
+		<xsl:call-template name="column.trailing"/>
29 56
 	    </xsl:when>
30 57
 	    <xsl:when test="$type='short'">
31 58
 		<xsl:text>SMALLINT</xsl:text>
59
+		<xsl:call-template name="column.size"/>
60
+		<xsl:call-template name="column.trailing"/>
32 61
 	    </xsl:when>
33 62
 	    <xsl:when test="$type='int'">
34 63
 		<xsl:text>INT</xsl:text>
64
+		<xsl:call-template name="column.size"/>
65
+		<xsl:call-template name="column.trailing"/>
35 66
 	    </xsl:when>
36 67
 	    <xsl:when test="$type='long'">
37 68
 		<xsl:text>BIGINT</xsl:text>
69
+		<xsl:call-template name="column.size"/>
70
+		<xsl:call-template name="column.trailing"/>
38 71
 	    </xsl:when>
39 72
 	    <xsl:when test="$type='datetime'">
40 73
 		<xsl:text>DATETIME</xsl:text>
74
+		<xsl:call-template name="column.size"/>
75
+		<xsl:call-template name="column.trailing"/>
41 76
 	    </xsl:when>
42 77
 	    <xsl:when test="$type='double'">
43 78
 		<xsl:text>DOUBLE</xsl:text>
79
+		<xsl:call-template name="column.size"/>
80
+		<xsl:call-template name="column.trailing"/>
44 81
 	    </xsl:when>
45 82
 	    <xsl:when test="$type='float'">
46 83
 		<xsl:text>FLOAT</xsl:text>
84
+		<xsl:call-template name="column.size"/>
85
+		<xsl:call-template name="column.trailing"/>
47 86
 	    </xsl:when>
48 87
 	    <xsl:when test="$type='string'">
49 88
 		<xsl:text>VARCHAR</xsl:text>
89
+		<xsl:call-template name="column.size"/>
90
+		<xsl:call-template name="column.trailing"/>
50 91
 	    </xsl:when>
51 92
 	    <xsl:when test="$type='binary'">
52 93
 		<xsl:text>BLOB</xsl:text>
94
+		<xsl:call-template name="column.size"/>
95
+		<xsl:call-template name="column.trailing"/>
53 96
 	    </xsl:when>
54 97
 	    <xsl:otherwise>
55 98
 		<xsl:call-template name="type-error"/>
... ...
@@ -57,7 +100,7 @@
57 100
 	</xsl:choose>
58 101
     </xsl:template>
59 102
 
60
-    <xsl:template name="column.sign">
103
+    <xsl:template name="column.trailing">
61 104
 	<xsl:variable name="signed">
62 105
 	    <xsl:call-template name="get-sign"/>
63 106
 	</xsl:variable>
... ...
@@ -7,5 +7,139 @@
7 7
 
8 8
     <xsl:import href="sql.xsl"/>
9 9
 
10
-</xsl:stylesheet>
10
+    <xsl:template name="column.type">
11
+	<xsl:variable name="type">
12
+	    <xsl:call-template name="get-type"/>
13
+	</xsl:variable>
14
+
15
+	<xsl:choose>
16
+	    <xsl:when test="db:type">
17
+		<xsl:value-of select="normalize-space(db:type)"/>
18
+	    </xsl:when>
19
+	    <xsl:when test="$type='char'">
20
+		<xsl:text>SMALLINT</xsl:text>
21
+	    </xsl:when>
22
+	    <xsl:when test="$type='short'">
23
+		<xsl:text>SMALLINT</xsl:text>
24
+	    </xsl:when>
25
+	    <xsl:when test="$type='int'">
26
+		<xsl:text>INTEGER</xsl:text>
27
+	    </xsl:when>
28
+	    <xsl:when test="$type='long'">
29
+		<xsl:text>BIGINT</xsl:text>
30
+	    </xsl:when>
31
+	    <xsl:when test="$type='datetime'">
32
+		<xsl:text>TIMESTAMP</xsl:text>
33
+	    </xsl:when>
34
+	    <xsl:when test="$type='double'">
35
+		<xsl:text>DOUBLE PRECISION</xsl:text>
36
+	    </xsl:when>
37
+	    <xsl:when test="$type='float'">
38
+		<xsl:text>REAL</xsl:text>
39
+		<xsl:call-template name="column.size"/>
40
+		<xsl:call-template name="column.trailing"/>
41
+	    </xsl:when>
42
+	    <xsl:when test="$type='string'">
43
+		<xsl:text>VARCHAR</xsl:text>
44
+		<xsl:call-template name="column.size"/>
45
+		<xsl:call-template name="column.trailing"/>
46
+	    </xsl:when>
47
+	    <xsl:when test="$type='binary'">
48
+		<xsl:text>BYTEA</xsl:text>
49
+		<xsl:call-template name="column.size"/>
50
+		<xsl:call-template name="column.trailing"/>
51
+	    </xsl:when>
52
+	    <xsl:otherwise>
53
+		<xsl:call-template name="type-error"/>
54
+	    </xsl:otherwise>
55
+	</xsl:choose>
56
+    </xsl:template>
57
+
58
+    <xsl:template name="column.trailing">
59
+	<xsl:variable name="column.type">
60
+	    <xsl:call-template name="get-type"/>
61
+	</xsl:variable>
62
+
63
+	<xsl:if test="$column.type='datetime'">
64
+	    <xsl:text> WITHOUT TIME ZONE</xsl:text>
65
+	</xsl:if>
66
+    </xsl:template>
67
+
68
+    <xsl:template match="table">
69
+	<xsl:variable name="table.name">
70
+	    <xsl:call-template name="get-name"/>
71
+	</xsl:variable>
72
+
73
+	<xsl:text>CREATE TABLE </xsl:text>
74
+	<xsl:value-of select="$table.name"/>
75
+	<xsl:text> (&#x0A;</xsl:text>
76
+
77
+	<!-- Process all columns -->
78
+	<xsl:apply-templates select="column"/>
79
+
80
+	<!-- Process all indexes -->
81
+	<xsl:apply-templates select="index[child::unique]"/>
82
+
83
+	<xsl:text>&#x0A;</xsl:text>
11 84
 
85
+	<xsl:call-template name="table.close"/>
86
+
87
+	<xsl:for-each select="index[count(child::unique)=0]">
88
+	    <xsl:call-template name="create_index"/>
89
+	</xsl:for-each>
90
+
91
+	<!-- Process initial rows of data -->
92
+	<xsl:apply-templates select="row"/>
93
+    </xsl:template>
94
+
95
+    <xsl:template match="index">
96
+	<xsl:variable name="index.name">
97
+	    <xsl:call-template name="get-name"/>
98
+	</xsl:variable>
99
+
100
+	<xsl:if test="position()=1">
101
+	    <xsl:text>,&#x0A;</xsl:text>
102
+	</xsl:if>
103
+	<xsl:text>    </xsl:text>
104
+	<xsl:if test="not($index.name='')">
105
+	    <xsl:text>CONSTRAINT </xsl:text>
106
+	    <xsl:value-of select="concat($index.name, ' ')"/>
107
+	</xsl:if>
108
+	<xsl:text>UNIQUE (</xsl:text>
109
+	<xsl:apply-templates select="colref"/>
110
+	<xsl:text>)</xsl:text>
111
+	
112
+	<xsl:if test="not(position()=last())">
113
+	    <xsl:text>,</xsl:text>
114
+	    <xsl:text>&#x0A;</xsl:text>
115
+	</xsl:if>
116
+    </xsl:template>
117
+
118
+    <xsl:template name="create_index">
119
+	<xsl:variable name="index.name">
120
+	    <xsl:call-template name="get-name"/>
121
+	</xsl:variable>
122
+	<xsl:variable name="table.name">
123
+	    <xsl:call-template name="get-name">
124
+		<xsl:with-param name="select" select="parent::table"/>
125
+	    </xsl:call-template>
126
+	</xsl:variable>
127
+
128
+	<xsl:text>CREATE </xsl:text>
129
+	<xsl:if test="unique">
130
+	    <xsl:text>UNIQUE </xsl:text>
131
+	</xsl:if>
132
+	<xsl:text>INDEX </xsl:text>
133
+	<xsl:value-of select="$index.name"/>
134
+	<xsl:text> ON </xsl:text>
135
+	<xsl:value-of select="$table.name"/>
136
+	<xsl:text> (</xsl:text>
137
+	<xsl:apply-templates select="colref"/>
138
+	<xsl:text>);&#x0A;</xsl:text>
139
+
140
+	<xsl:if test="position()=last()">
141
+	    <xsl:text>&#x0A;</xsl:text>
142
+	</xsl:if>
143
+    </xsl:template>
144
+
145
+</xsl:stylesheet>
... ...
@@ -19,37 +19,6 @@
19 19
 
20 20
 <!-- ################ DATABASE ################# -->
21 21
 
22
-    <xsl:template match="database">
23
-	<xsl:variable name="database.name">
24
-	    <xsl:call-template name="get-name"/>
25
-	</xsl:variable>
26
-
27
-	<xsl:text>CREATE DATABASE </xsl:text>
28
-	<xsl:value-of select="$database.name"/>
29
-	<xsl:text>;&#x0A;</xsl:text>
30
-
31
-	<xsl:text>USE </xsl:text>
32
-	<xsl:value-of select="$database.name"/>
33
-	<xsl:text>;&#x0A;&#x0A;</xsl:text>
34
-
35
-	<xsl:apply-imports/>
36
-    </xsl:template>
37
-
38
-    <xsl:template match="database" mode="drop">
39
-	<xsl:variable name="database.name">
40
-	    <xsl:call-template name="get-name"/>
41
-	</xsl:variable>
42
-
43
-	<xsl:text>USE </xsl:text>
44
-	<xsl:value-of select="$database.name"/>
45
-	<xsl:text>;&#x0A;&#x0A;</xsl:text>
46
-	<xsl:apply-templates mode="drop" select="table"/>
47
-	<xsl:text>&#x0A;</xsl:text>
48
-	<xsl:text>DROP DATABASE </xsl:text>
49
-	<xsl:value-of select="$database.name"/>
50
-	<xsl:text>;&#x0A;</xsl:text>
51
-    </xsl:template>
52
-    
53 22
 <!-- ################ /DATABASE ################# -->
54 23
 
55 24
     
... ...
@@ -78,16 +47,10 @@
78 47
 	<xsl:apply-templates select="row"/>
79 48
     </xsl:template>
80 49
 
81
-    <xsl:template match="table" mode="drop">
82
-	<xsl:text>DROP TABLE </xsl:text>
83
-	<xsl:call-template name="get-name"/>
84
-	<xsl:text>;&#x0A;</xsl:text>
85
-    </xsl:template>
86
-
87 50
     <xsl:template name="table.close">
88 51
 	<xsl:text>);&#x0A;&#x0A;</xsl:text>
89 52
     </xsl:template>
90
-
53
+    
91 54
 <!-- ################ /TABLE ################  -->
92 55
 
93 56
 <!-- ################ COLUMN ################  -->
... ...
@@ -99,10 +62,6 @@
99 62
 
100 63
 	<xsl:call-template name="column.type"/>
101 64
 
102
-	<xsl:call-template name="column.size"/>
103
-
104
-	<xsl:call-template name="column.sign"/>
105
-
106 65
 	<xsl:variable name="null">
107 66
 	    <xsl:call-template name="get-null"/>
108 67
 	</xsl:variable>
... ...
@@ -146,7 +105,10 @@
146 105
     </xsl:template>
147 106
 
148 107
     <xsl:template name="column.type">
108
+	<!-- FIXME -->
149 109
 	<xsl:call-template name="get-type"/>
110
+	<xsl:call-template name="column.size"/>
111
+	<xsl:call-template name="column.trailing"/>
150 112
     </xsl:template>
151 113
 
152 114
     <xsl:template name="column.size">
... ...
@@ -161,7 +123,7 @@
161 123
 	</xsl:if>
162 124
     </xsl:template>
163 125
 
164
-    <xsl:template name="column.sign"/>
126
+    <xsl:template name="column.trailing"/>
165 127
 
166 128
 <!-- ################ /COLUMN ################  -->
167 129