all: updated FSF address in GPL text
[sip-router] / doc / stylesheets / dbschema_k / xsl / modules_c.xsl
1 <?xml version='1.0'?>
2 <!--
3  * $Id: db_berkeley.xsl 3142 2007-11-15 14:09:15Z henningw $
4  *
5  * XSL converter script for generating module parameter templates.
6  *
7  * Copyright (C) 2008 Henning Westerholt
8  *
9  * This file is part of Kamailio, a free SIP server.
10  *
11  * Kamailio is free software; you can redistribute it and/or modify
12  * it under the terms of the GNU General Public License as published by
13  * the Free Software Foundation; either version 2 of the License, or
14  * (at your option) any later version
15  *
16  * Kamailio is distributed in the hope that it will be useful,
17  * but WITHOUT ANY WARRANTY; without even the implied warranty of
18  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
19  * GNU General Public License for more details.
20  *
21  * You should have received a copy of the GNU General Public License
22  * along with this program; if not, write to the Free Software
23  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
24  *
25  */
26 -->
27
28 <!--
29  * Yes, this is probably not pretty, as XSL is not the perfect tool to generate
30  * C code. But we've now this infrastructure for the databases, and it works.
31 -->
32
33 <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
34                 version='1.0'
35                 xmlns:xi="http://www.w3.org/2001/XInclude">
36
37 <xsl:import href="common.xsl"/>
38 <xsl:output method="text" indent="no" omit-xml-declaration="yes"/>
39
40     <!-- Create the file for the tables in module subdirectory -->
41 <xsl:template match="/">
42         <xsl:variable name="createfile" select="concat($dir, concat('/', concat('db_', $prefix, '.c')))"/>
43         <xsl:document href="{$createfile}" method="text" indent="no" omit-xml-declaration="yes">
44
45 <!-- doxygen header -->
46 <xsl:text>
47 /*!
48  * \file
49  * \ingroup db
50  * \brief Database support for modules.
51  *
52  * Database support functions for modules.
53  *
54  * @cond
55  * WARNING:
56  * This file was autogenerated from the XML source file
57 </xsl:text>
58 <xsl:value-of select="concat(' * ', $dir, 'kamailio-', $prefix, '.xml.')"/>
59 <xsl:text>
60  * It can be regenerated by running 'make modules' in the db/schema
61  * directory of the source code. You need to have xsltproc and
62  * docbook-xsl stylesheets installed.
63  * ALL CHANGES DONE HERE WILL BE LOST IF THE FILE IS REGENERATED
64  * @endcond
65  */
66
67 </xsl:text>
68
69 <xsl:value-of select="concat('#include &quot;', 'db_', $prefix, '.h&quot;&#x0A;&#x0A;')"/>
70
71 <xsl:text>/* database variables */&#x0A;</xsl:text>
72 <xsl:text>/* TODO assign read-write or read-only URI, introduce a parameter in XML */&#x0A;&#x0A;</xsl:text>
73 <xsl:value-of select="concat('//extern str ', $prefix, '_db_url;&#x0A;')"/>
74 <xsl:value-of select="concat('db_con_t * ', $prefix, '_dbh = NULL;&#x0A;')"/>
75 <xsl:value-of select="concat('db_func_t ', $prefix, '_dbf;&#x0A;&#x0A;')"/>
76
77 <xsl:apply-templates select="/database[1]"/>
78
79 <xsl:text>
80 /*
81  * Closes the DB connection.
82  */
83 </xsl:text>
84 <xsl:value-of select="concat('void ', $prefix, '_db_close(void) {&#x0A;')"/>
85 <xsl:value-of select="concat('&#9;if (', $prefix, '_dbh) {&#x0A;')"/>
86 <xsl:value-of select="concat('&#9;&#9;', $prefix, '_dbf.close(', $prefix, '_dbh);&#x0A;')"/>
87 <xsl:value-of select="concat('&#9;&#9;', $prefix, '_dbh = NULL;&#x0A;&#9;}&#x0A;}&#x0A;&#x0A;')"/>
88
89 <xsl:text>
90 /*!
91  * Initialises the DB API, check the table version and closes the connection.
92  * This should be called from the mod_init function.
93  *
94  * \return 0 means ok, -1 means an error occured.
95  */
96 </xsl:text>
97 <xsl:value-of select="concat('int ', $prefix, '_db_init(void) {&#x0A;')"/>
98 <xsl:value-of select="concat('&#9;if (!', $prefix, '_db_url.s || !', $prefix, '_db_url.len) {')"/>
99 <xsl:text>
100                 LM_ERR(&quot;you have to set the db_url module parameter.\n&quot;);
101                 return -1;
102         }
103 </xsl:text>
104 <xsl:value-of select="concat('&#9;if (db_bind_mod(&amp;', $prefix, '_db_url, &amp;', $prefix, '_dbf) &lt; 0) {')"/>
105 <xsl:text>
106                 LM_ERR(&quot;can't bind database module.\n&quot;);
107                 return -1;
108         }
109 </xsl:text>
110 <xsl:value-of select="concat('&#9;if ((', $prefix, '_dbh = ', $prefix, '_dbf.init(&amp;', $prefix, '_db_url)) == NULL) {')"/>
111 <xsl:text>
112                 LM_ERR(&quot;can't connect to database.\n&quot;);
113                 return -1;
114         }
115 </xsl:text>
116 <xsl:text>      if (
117 </xsl:text>
118
119 <!-- create the table version check -->
120 <xsl:for-each select="//database[1]/table">
121         <xsl:variable name="table">
122                 <xsl:call-template name="get-name">
123                 </xsl:call-template>
124         </xsl:variable>
125         <xsl:value-of select="concat('&#9;(db_check_table_version(&amp;', $prefix, '_dbf, ', $prefix, '_dbh, &amp;', $table, '_table, ', $table, '_version) &lt; 0)')"/>
126         <xsl:if test="not(position()=last())">
127                 <xsl:text> ||&#x0A;</xsl:text>
128         </xsl:if>
129 </xsl:for-each>
130 <xsl:text>
131         ) {
132                 LM_ERR(&quot;during table version check.\n&quot;);
133 </xsl:text>
134 <xsl:value-of select="concat('&#9;&#9;', $prefix, '_db_close();')"/>
135 <xsl:text>
136                 return -1;
137         }
138 </xsl:text>
139 <xsl:value-of select="concat('&#9;', $prefix, '_db_close();')"/>
140 <xsl:text>
141         return 0;
142 }
143
144 </xsl:text>
145
146 <xsl:text>
147 /*!
148  * Initialize the DB connection without checking the table version and DB URL.
149  * This should be called from child_init. An already existing database
150  * connection will be closed, and a new one created.
151  *
152  * \return 0 means ok, -1 means an error occured.
153  */
154 </xsl:text>
155 <xsl:value-of select="concat('int ', $prefix, '_db_open(void) {&#x0A;')"/>
156 <xsl:value-of select="concat('&#9;if (', $prefix, '_dbh) {&#x0A;')"/>
157 <xsl:value-of select="concat('&#9;&#9;', $prefix, '_dbf.close(', $prefix, '_dbh);&#x0A;&#9;}&#x0A;')"/>
158 <xsl:value-of select="concat('&#9;if ((', $prefix, '_dbh = ', $prefix, '_dbf.init(&amp;', $prefix, '_db_url)) == NULL) {')"/>
159 <xsl:text>
160                 LM_ERR(&quot;can't connect to database.\n&quot;);
161                 return -1;
162         }
163         return 0;
164 }
165
166 </xsl:text>
167
168 <xsl:text>
169 /*!
170  * Update the variable length after eventual assignments from the config script.
171  * This is necessary because we're using the 'str' type.
172  */
173 </xsl:text>
174 <xsl:value-of select="concat('void ', $prefix, '_db_vars(void) {&#x0A;')"/>
175 <!-- TODO remove if case, if db_url is also set from this code -->
176 <xsl:value-of select="concat('&#9;if (', $prefix, '_db_url.s) ', $prefix, '_db_url.len = strlen(', $prefix, '_db_url.s);&#x0A;')"/>
177
178 <xsl:for-each select="//database[1]/table">
179         <xsl:variable name="table.name">
180                 <xsl:call-template name="get-name">
181                 </xsl:call-template>
182         </xsl:variable>
183         <xsl:value-of select="concat('&#9;', $table.name, '_table.len = strlen(', $table.name, '_table.s',');&#x0A;')"/>
184         <xsl:for-each select="column">
185                 <xsl:variable name="column.name">
186                         <xsl:call-template name="get-name"/>
187                 </xsl:variable>
188                 <xsl:value-of select="concat('&#9;', $table.name, '_', $column.name, '_col.len = strlen(', $table.name, '_', $column.name, '_col.s', ');&#x0A;')"/>
189         </xsl:for-each>
190 </xsl:for-each>
191 <xsl:text>}&#x0A;</xsl:text>
192                 <xsl:text>&#x0A;</xsl:text>
193
194 </xsl:document>
195 </xsl:template>
196
197         <!-- create table name parameter -->
198         <xsl:template match="table">
199         <xsl:variable name="name">
200                 <xsl:call-template name="get-name"/>
201         </xsl:variable>
202
203         <xsl:value-of select="concat('str ', $name, '_table = str_init(&quot;', $name, '&quot;);&#x0A;')"/>
204         <xsl:text>&#x0A;</xsl:text>
205
206         <xsl:text>/* column names */&#x0A;</xsl:text>
207         <xsl:apply-imports/>
208
209         <xsl:text>&#x0A;</xsl:text>
210         <xsl:text>/* table version */&#x0A;</xsl:text>
211         <xsl:apply-templates select="version"/>
212         </xsl:template>
213
214         <!-- create version parameter -->
215         <xsl:template match="version">
216         <xsl:variable name="table.name">
217                 <xsl:call-template name="get-name">
218                 <xsl:with-param name="select" select="parent::table"/>
219         </xsl:call-template>
220         </xsl:variable>
221         <xsl:value-of select="concat('const unsigned int ', $table.name, '_version', ' = ')"/>
222         <xsl:value-of select="text()"/>
223         <xsl:text>;&#x0A;</xsl:text>
224         <xsl:text>&#x0A;</xsl:text>
225         </xsl:template>
226
227         <!-- Create column parameter -->
228         <xsl:template match="column">
229         <xsl:variable name="table.name">
230                 <xsl:call-template name="get-name">
231                 <xsl:with-param name="select" select="parent::table"/>
232                 </xsl:call-template>
233         </xsl:variable>
234         <xsl:variable name="column.name">
235                 <xsl:call-template name="get-name"/>
236         </xsl:variable>
237         <xsl:value-of select="concat('str ', $table.name, '_', $column.name, '_col = str_init(&quot;', $column.name, '&quot;);&#x0A;')"/>
238         </xsl:template>
239
240 </xsl:stylesheet>