File: db_interface.xml

package info (click to toggle)
kamailio 5.6.3-2
  • links: PTS, VCS
  • area: main
  • in suites: bookworm
  • size: 68,332 kB
  • sloc: ansic: 744,091; xml: 196,848; cpp: 14,471; makefile: 8,859; sh: 8,814; sql: 7,844; yacc: 3,863; perl: 2,955; python: 2,710; java: 449; javascript: 269; php: 258; ruby: 225; cs: 40; awk: 27
file content (508 lines) | stat: -rw-r--r-- 15,446 bytes parent folder | download | duplicates (7)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE section PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN" 
   "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd">

<section id="db_interface" xmlns:xi="http://www.w3.org/2001/XInclude">
    <sectioninfo>
	<revhistory>
	    <revision>
		<revnumber>$Revision$</revnumber>
		<date>$Date$</date>
	    </revision>
	</revhistory>
    </sectioninfo>

    <title>The Database Interface</title>
    <para>
	This is a generic database interface for modules that need to utilize a
	database. The interface should be used by all modules that access
	database.  The interface will be independent of the underlying database
	server.
    </para>
    <note>
	<para>
	    If possible, use predefined macros if you need to access any
	    structure attributes.
	</para>
	<para>
	    For additional description, see comments in sources of mysql
	    module.
	</para>
	<para>
	    If you want to see more complicated examples of how the API could
	    be used, see sources of dbexample, usrloc or auth modules.
	</para>
    </note>
    
    <section id="data_types">
	<title>Data types</title>
	<para>
	    There are several data types. All of them are defined in header
	    files under <filename>db</filename> subdirectory, a client must
	    include <filename>db.h</filename> header file to be able to use
	    them.
	</para>

	<xi:include href="db_con_t.xml"/>
	<xi:include href="db_key_t.xml"/>
	<xi:include href="db_type_t.xml"/>
	<xi:include href="db_val_t.xml"/>
	<xi:include href="db_row_t.xml"/>
	<xi:include href="db_res_t.xml"/>
    </section>
	
    <section id="db_functions">
	<title>Functions</title>
	<para>
	    There are several functions that implement the database
	    <acronym>API</acronym> logic. All function names start with db_
	    prefix, except <function>bind_dbmod</function>.
	    <function>bind_dbmod</function> is implemented in
	    <filename>db.c</filename> file, all other functions are implemented
	    in a standalone module.  Detailed description of functions follows.
	</para>
	
	<section id="bind_dbmod">
	    <title><function>bind_dbmod</function></title>
	    <para>
		This function is special, it's only purpose is to call
		<function>find_export</function> function in the
		<acronym>SER</acronym> core and find addresses of all other
		functions (starting with db_ prefix). This function
		<emphasis>MUST</emphasis> be called <emphasis>FIRST</emphasis>
		!
	    </para>
	    <funcsynopsis>
		<funcprototype>
		    <funcdef>int <function>bind_dbmod</function></funcdef>
		    <void/>
		</funcprototype>
	    </funcsynopsis>
	    <para>
		The function takes no parameters.
	    </para>
	    <para>
		The function returns 0 if it was able to find addresses of all
		other functions, otherwise value &lt; 0 is returned.
	    </para>
	</section> <!-- bind_dbmod -->
	
	<section id="db_init">
	    <title><function>db_init</function></title>
	    <para>
		Use this function to initialize the database
		<acronym>API</acronym> and open a new database connection. This
		function must be called after <function>bind_dbmod</function>
		but before any other function is called.
	    </para>
	    <funcsynopsis>
		<funcprototype>
		    <funcdef>db_con_t* <function>db_init</function></funcdef>
		    <paramdef>const char* <parameter>_sql_url</parameter></paramdef>
		</funcprototype>
	    </funcsynopsis>
	    <para>
		The function takes one parameter, the parameter must contain
		database connection <acronym>URL</acronym>. The
		<acronym>URL</acronym> is of the form
		mysql://username:password@host:port/database where:
		<itemizedlist>
		    <listitem>
			<para>
			    <emphasis>username</emphasis> - Username to use
			    when logging into database (optional).
			</para>
		    </listitem>
		    <listitem>
			<para>
			    <emphasis>password</emphasis> - Password if it was
			    set (optional).
			</para>
		    </listitem>
		    <listitem>
			<para>
			    <emphasis>host</emphasis> - Hostname or IP address
			    of the host where database server lives
			    (mandatory).
			</para>
		    </listitem>
		    <listitem>
			<para>
			    <emphasis>port</emphasis> - Port number of the
			    server if the port differs from default value
			    (optional).
			</para>
		    </listitem>
		    <listitem>
			<para>
			    <emphasis>database</emphasis> - If the database server supports 
			    multiple databases, you must specify name of the database (optional).
			</para>
		    </listitem>
		</itemizedlist>
	    </para>
	    <para>
		The function returns pointer to <type>db_con_t</type>*
		representing the connection if it was successful, otherwise 0
		is returned.
	    </para>
	</section> <!-- db-init -->
	
	<section id="db_close">
	    <title><function>db_close</function></title>
	    <para>
		The function closes previously open connection and frees all
		previously allocated memory. The function
		<function>db_close</function> must be the very last function
		called.
	    </para>
		<funcsynopsis>
		<funcprototype>
		    <funcdef>void <function>db_close</function></funcdef>
		    <paramdef>db_con_t* <parameter>_h</parameter></paramdef>
		</funcprototype>
	    </funcsynopsis>
	    <para>
		The function takes one parameter, this parameter is a pointer
		to <type>db_con_t</type> structure representing database
		connection that should be closed.
	    </para>
	    <para>
		Function doesn't return anything.
	    </para>
	</section> <!-- db-close -->
	
	<section id="db_query">
	    <title><function>db_query</function></title>
	    <para>
		This function implements SELECT <acronym>SQL</acronym> directive.
	    </para>
	    <funcsynopsis>
		<funcprototype>
		    <funcdef>int <function>db_query</function></funcdef>
		    <paramdef>db_con_t* <parameter>_h</parameter></paramdef>
		    <paramdef>db_key_t* <parameter>_k</parameter></paramdef>
		    <paramdef>db_val_t* <parameter>_v</parameter></paramdef>
		    <paramdef>db_key_t* <parameter>_c</parameter></paramdef>
		    <paramdef>int <parameter>_n</parameter></paramdef>
		    <paramdef>int <parameter>_nc</parameter></paramdef>
		    <paramdef>db_key_t* <parameter>_o</parameter></paramdef>
		    <paramdef>db_res_t** <parameter>_r</parameter></paramdef>
		</funcprototype>
	    </funcsynopsis>
	    <para>
		The function takes 8 parameters:
		<itemizedlist>
		    <listitem>
			<para>
			    <emphasis>_h</emphasis> - Database connection handle.
			</para>
		    </listitem>
		    <listitem>
			<para>
			    <emphasis>_k</emphasis> - Array of column names
			    that will be compared and their values must
			    match.
			</para>
		    </listitem>
		    <listitem>
			<para>
			    <emphasis>_v</emphasis> - Array of values,
			    columns specified in _k parameter must match
			    these values.
			</para>
		    </listitem>
		    <listitem>
			<para>
			    <emphasis>_c</emphasis> - Array of column names
			    that you are interested in.
			</para>
		    </listitem>
		    <listitem>
			<para>
			    <emphasis>_n</emphasis> - Number of key-value
			    pairs to match in _k and _v parameters.
			</para>
		    </listitem>
		    <listitem>
			<para>
			    <emphasis>_nc</emphasis> - Number of columns in
			    _c parameter.
			</para>
		    </listitem>
		    <listitem>
			<para>
			    <emphasis>_o</emphasis> - Order by.
			</para>
		    </listitem>
		    <listitem>
			<para>
			    <emphasis>_r</emphasis> - Address of variable
				where pointer to the result will be stored.
			</para>
		    </listitem>
		</itemizedlist>
		If _k and _v parameters are NULL and _n is zero, you will get
		the whole table.  If _c is NULL and _nc is zero, you will get
		all table columns in the result
	    </para>
	    <para>
		_r will point to a dynamically allocated structure, it is
		necessary to call db_free_result function once you are finished
		with the result.
	    </para>
	    <para>
		Strings in the result are not duplicated, they will be
		discarded if you call db_free_result, make a copy yourself if
		you need to keep it after db_free_result.
	    </para>
	    <para>
		You must call db_free_result <emphasis>BEFORE</emphasis> you
		can call db_query again !
	    </para>
	    <para>
		The function returns 0 if everything is OK, otherwise value
		&lt; 0 is returned.
	    </para>
	</section> <!-- db_query -->
	
	<section id="db_free_result">
	    <title><function>db_free_result</function></title>
	    <para>
		This function frees all memory allocated previously in
		<function>db_query</function>, it is necessary to call this
		function for a <type>db_res_t</type> structure if you don't
		need the structure anymore. You must call this function
		<emphasis>BEFORE</emphasis> you call
		<function>db_query</function> again !
	    </para>
	    <funcsynopsis>
		<funcprototype>
		    <funcdef>int <function>db_free_result</function></funcdef>
		    <paramdef>db_con_t* <parameter>_h</parameter></paramdef>
		    <paramdef>db_res_t* <parameter>_r</parameter></paramdef>
		</funcprototype>
	    </funcsynopsis>
	    <para>
		The function takes 2 parameters:
		<itemizedlist>
		    <listitem>
			<para>
			    <parameter>_h</parameter> - Database connection handle.
			</para>
		    </listitem>
		    <listitem>
			<para>
			    <parameter>_r</parameter> - Pointer to db_res_t
			    structure to destroy.
			</para>
		    </listitem>
		</itemizedlist>
	    </para>
	    <para>
		The function returns 0 if everything is OK, otherwise the
		function returns value &lt; 0.
	    </para>
	</section> <!-- db_free_result -->
	
	<section id="db_insert">
	    <title><function>db_insert</function></title>
	    <para>
		This function implements INSERT SQL directive, you can
		insert one or more rows in a table using this function.
	    </para>
	    <funcsynopsis>
		<funcprototype>
		    <funcdef>int <function>db_insert</function></funcdef>
		    <paramdef>db_con_t* <parameter>_h</parameter></paramdef>
		    <paramdef>db_key_t* <parameter>_k</parameter></paramdef>
		    <paramdef>db_val_t* <parameter>_v</parameter></paramdef>
		    <paramdef>int <parameter>_n</parameter></paramdef>
		</funcprototype>
	    </funcsynopsis>
	    <para>
		The function takes 4 parameters:
		<itemizedlist>
		    <listitem>
			<para>
			    <parameter>_h</parameter> - Database connection handle.
			</para>
		    </listitem>
		    <listitem>
			<para>
			    <parameter>_k</parameter> - Array of keys (column names).
			</para>
		    </listitem>
		    <listitem>
			<para>
			    <parameter>_v</parameter> - Array of values for
			    keys specified in _k parameter.
			</para>
		    </listitem>
		    <listitem>
			<para>
			    <parameter>_n</parameter> - Number of
			    keys-value pairs int _k and _v parameters.
			    </para>
		    </listitem>
		</itemizedlist>
	    </para>
	    <para>
		The function returns 0 if everything is OK, otherwise the
		function returns value &lt; 0.
	    </para>
	</section> <!-- db_insert -->
	
	<section id="db_delete">
	    <title><function>db_delete</function></title>
	    <para>
		This function implements DELETE SQL directive, it is
		possible to delete one or more rows from a table.
	    </para>
	    <funcsynopsis>
		<funcprototype>
		    <funcdef>int <function>db_delete</function></funcdef>
		    <paramdef>db_con_t* <parameter>_h</parameter></paramdef>
		    <paramdef>db_key_t* <parameter>_k</parameter></paramdef>
		    <paramdef>db_val_t* <parameter>_v</parameter></paramdef>
		    <paramdef>int <parameter>_n</parameter></paramdef>
		</funcprototype>
	    </funcsynopsis>
	    <para>
		The function takes 4 parameters:
		<itemizedlist>
		    <listitem>
			<para>
			    <parameter>_h</parameter> - Database connection handle.
			</para>
		    </listitem>
		    <listitem>
			<para>
			    <parameter>_k</parameter> - Array of keys
			    (column names) that will be matched.
			</para>
		    </listitem>
		    <listitem>
			<para>
			    <parameter>_v</parameter> - Array of values
			    that the row must match to be deleted.
			</para>
		    </listitem>
		    <listitem>
			<para>
			    <parameter>_n</parameter> - Number of
			    keys-value parameters in _k and _v parameters.
			</para>
		    </listitem>
		</itemizedlist>
		If _k is NULL and _v is NULL and _n is zero, all rows are
		deleted (table will be empty).
	    </para>
	    <para>
		The function returns 0 if everything is OK, otherwise the
		function returns value &lt; 0.
	    </para>
	</section> <!-- db_delete -->
	
	<section id="db_update">
	    <title><function>db_update</function></title>
	    <para>
		The function implements UPDATE SQL directive. It is possible to
		modify one or more rows in a table using this function.
	    </para>
		<funcsynopsis>
		<funcprototype>
		    <funcdef>int <function>db_update</function></funcdef>
		    <paramdef>db_con_t* <parameter>_h</parameter></paramdef>
		    <paramdef>db_key_t* <parameter>_k</parameter></paramdef>
		    <paramdef>db_val_t* <parameter>_v</parameter></paramdef>
		    <paramdef>db_key_t* <parameter>_uk</parameter></paramdef>
		    <paramdef>db_val_t* <parameter>_uv</parameter></paramdef>
		    <paramdef>int <parameter>_n</parameter></paramdef>
		    <paramdef>int <parameter>_un</parameter></paramdef>
		</funcprototype>
	    </funcsynopsis>
	    <para>
		The function takes 7 parameters:
		<itemizedlist>
		    <listitem>
			<para>
			    <parameter>_h</parameter> - Database connection handle.
			</para>
		    </listitem>
		    <listitem>
			<para>
			    <parameter>_k</parameter> - Array of keys (column names) that will be matched.
			</para>
		    </listitem>
		    <listitem>
			<para>
			    <parameter>_v</parameter> - Array of values that the row must match 
			    to be modified.
			</para>
		    </listitem>
		    <listitem>
			<para>
			    <parameter>_uk</parameter> - Array of keys (column names) that will be modified.
			</para>
		    </listitem>
		    <listitem>
			<para>
			    <parameter>_uv</parameter> - New values for keys specified in _k parameter.
			</para>
		    </listitem>
		    <listitem>
			<para>
			    <parameter>_n</parameter> - Number of key-value pairs in _k and _v parameters.
			</para>
		    </listitem>
		    <listitem>
			<para>
			    <parameter>_un</parameter> - Number of key-value pairs 
			    in _uk and _uv parameters.
			</para>
		    </listitem>
		</itemizedlist>
	    </para>
	    <para>
		The function returns 0 if everything is OK, otherwise the function returns
		value &lt; 0.
	    </para>
	</section> <!-- db_update -->

	<section id="db_use_table">
	    <title><function>db_use_table</function></title>
	    <para>
		The function db_use_table takes a table name and stores it
		in db_con_t structure.  All subsequent operations (insert,
		delete, update, query) are performed on that table.
	    </para>
	    <funcsynopsis>
		<funcprototype>
		    <funcdef>int <function>db_use-table</function></funcdef>
		    <paramdef>db_con_t* <parameter>_h</parameter></paramdef>
		    <paramdef>cons char* <parameter>_t</parameter></paramdef>
		</funcprototype>
	    </funcsynopsis>
	    <para>
		The function takes 2 parameters:
		<itemizedlist>
		    <listitem>
			<para>
			    <parameter>_h</parameter> - Database connection handle.
			</para>
		    </listitem>
		    <listitem>
			<para>
			    <parameter>_t</parameter> - Table name.
			</para>
		    </listitem>
		</itemizedlist>
	    </para>
	    <para>
		The function returns 0 if everything is OK, otherwise the
		function returns value &lt; 0.
	    </para>
	</section>
    </section>
</section>