Merge kamailio modules into sip-router master branch
[sip-router] / lib / srdb1 / db_res.h
1 /* 
2  * $Id$ 
3  *
4  * Copyright (C) 2001-2003 FhG Fokus
5  * Copyright (C) 2007-2008 1&1 Internet AG
6  *
7  * This file is part of Kamailio, a free SIP server.
8  *
9  * Kamailio is free software; you can redistribute it and/or modify
10  * it under the terms of the GNU General Public License as published by
11  * the Free Software Foundation; either version 2 of the License, or
12  * (at your option) any later version
13  *
14  * Kamailio is distributed in the hope that it will be useful,
15  * but WITHOUT ANY WARRANTY; without even the implied warranty of
16  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17  * GNU General Public License for more details.
18  *
19  * You should have received a copy of the GNU General Public License 
20  * along with this program; if not, write to the Free Software 
21  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
22  */
23
24 /**
25  * \file lib/srdb1/db_res.h
26  * \brief Data structure that represents a result from a query.
27  *
28  * Data structure that represents a result from a database query,
29  * it also provides some convenience macros and some memory management
30  * functions for result structures.
31  * \ingroup db1
32  */
33
34 #ifndef DB1_RES_H
35 #define DB1_RES_H
36
37
38 #include "db_key.h"
39 #include "db_val.h"
40
41 struct db_row;
42
43 /**
44  * This type represents a result returned by db_query function (see below). The 
45  * result can consist of zero or more rows (see db_row_t description).
46  *
47  * Note: A variable of type db1_res_t returned by db_query function uses dynamicaly
48  * allocated memory, don't forget to call db_free_result if you don't need the
49  * variable anymore. You will encounter memory leaks if you fail to do this!
50  *
51  * In addition to zero or more rows, each db1_res_t object contains also an array
52  * of db_key_t objects. The objects represent keys (names of columns). *
53  */
54 typedef struct db1_res {
55         struct {
56                 db_key_t* names;   /**< Column names                    */
57                 db_type_t* types;  /**< Column types                    */
58                 int n;             /**< Number of columns               */
59         } col;
60         struct db_row* rows;   /**< Rows                            */
61         int n;                 /**< Number of rows in current fetch */
62         int res_rows;          /**< Number of total rows in query   */
63         int last_row;          /**< Last row                        */
64 } db1_res_t;
65
66
67 /** Return the column names */
68 #define RES_NAMES(re) ((re)->col.names)
69 /** Return the column types */
70 #define RES_TYPES(re) ((re)->col.types)
71 /** Return the number of columns */
72 #define RES_COL_N(re) ((re)->col.n)
73 /** Return the result rows */
74 #define RES_ROWS(re)  ((re)->rows)
75 /** Return the number of current result rows */
76 #define RES_ROW_N(re) ((re)->n)
77 /** Return the last row of the result */
78 #define RES_LAST_ROW(re)  ((re)->last_row)
79 /** Return the number of total result rows */
80 #define RES_NUM_ROWS(re) ((re)->res_rows)
81
82
83 /**
84  * Release memory used by rows in a result structure.
85  * \param _r the result that should be released
86  * \return zero on success, negative on errors
87  */
88 inline int db_free_rows(db1_res_t* _r);
89
90
91 /**
92  * Release memory used by columns. This methods assumes that the string values
93  * holding the column names are in memory allocated from the database driver,
94  * and thus must be not freed here.
95  * \param _r the result that should be released
96  * \return zero on success, negative on errors
97  */
98 inline int db_free_columns(db1_res_t* _r);
99
100
101 /**
102  * Create a new result structure and initialize it.
103  * \return a pointer to the new result on success, NULL on errors
104  */
105 inline db1_res_t* db_new_result(void);
106
107 /**
108  * Release memory used by a result structure.
109  * \return zero on success, negative on errors
110  */
111 inline int db_free_result(db1_res_t* _r);
112
113 /**
114  * Allocate storage for column names and type in existing result structure.
115  * If no more memory is available for the allocation of the types then the
116  * already allocated memory for the names is freed.
117  * \param _r filled result set
118  * \param cols number of columns
119  * \return zero on success, negative on errors
120  */
121 inline int db_allocate_columns(db1_res_t* _r, const unsigned int cols);
122
123
124 /**
125  * Allocate memory for rows.
126  * \param _res result set
127  * \return zero on success, negative on errors
128  */
129 inline int db_allocate_rows(db1_res_t* _res);
130
131 #endif /* DB1_RES_H */