Merge kamailio modules into sip-router master branch
[sip-router] / lib / srdb2 / db_fld.c
1 /* 
2  * $Id$ 
3  *
4  * Copyright (C) 2001-2005 FhG FOKUS
5  * Copyright (C) 2006-2007 iptelorg GmbH
6  *
7  * This file is part of ser, a free SIP server.
8  *
9  * ser 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  * For a license to use the ser software under conditions
15  * other than those described here, or to purchase support for this
16  * software, please contact iptel.org by e-mail at the following addresses:
17  *    info@iptel.org
18  *
19  * ser is distributed in the hope that it will be useful,
20  * but WITHOUT ANY WARRANTY; without even the implied warranty of
21  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
22  * GNU General Public License for more details.
23  *
24  * You should have received a copy of the GNU General Public License 
25  * along with this program; if not, write to the Free Software 
26  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
27  */
28
29 /** \ingroup DB_API 
30  * @{ 
31  */
32
33 #include "db_fld.h"
34
35 #include "../../mem/mem.h"
36 #include "../../dprint.h"
37
38 #include <string.h>
39
40
41 char* db_fld_str[] = {
42         "DB_NONE",
43         "DB_INT",
44         "DB_FLOAT",
45         "DB_DOUBLE",
46         "DB_CSTR",
47         "DB_STR",
48         "DB_DATETIME",
49         "DB_BLOB",
50         "DB_BITMAP"
51 };
52
53
54
55 int db_fld_init(db_fld_t* fld)
56 {
57         int i;
58
59         for(i = 0; !DB_FLD_LAST(fld[i]); i++) {
60                 if (db_gen_init(&fld[i].gen) < 0) return -1;
61         }
62         return 0;
63 }
64
65
66 void db_fld_close(db_fld_t* fld)
67 {
68         int i;
69
70         for(i = 0; !DB_FLD_LAST(fld[i]); i++) {
71                 db_gen_free(&fld[i].gen);
72         }
73 }
74
75
76 db_fld_t* db_fld(size_t n)
77 {
78         int i;
79         db_fld_t* newp;
80
81         newp = (db_fld_t*)pkg_malloc(sizeof(db_fld_t) * n);
82         if (newp == NULL) {
83                 ERR("db_fld: No memory left\n");
84                 return NULL;
85         }
86         memset(newp, '\0', sizeof(db_fld_t) * n);
87
88         for(i = 0; i < n; i++) {
89                 if (db_gen_init(&newp[i].gen) < 0) goto error;
90         }
91         return newp;
92
93  error:
94         if (newp) {
95                 while(i >= 0) {
96                         db_gen_free(&newp[i].gen);
97                         i--;
98                 }
99                 pkg_free(newp);
100         }
101         return NULL;
102 }
103
104
105 db_fld_t* db_fld_copy(db_fld_t* fld)
106 {
107         int i, n;
108         db_fld_t* newp;
109
110         for(n = 0; fld[n].name; n++);
111         n++; /* We need to copy the terminating element too */
112
113         newp = (db_fld_t*)pkg_malloc(sizeof(db_fld_t) * n);
114         if (newp == NULL) {
115                 ERR("db_fld: No memory left\n");
116                 return NULL;
117         }
118         memcpy(newp, fld, sizeof(db_fld_t) * n);
119         for(i = 0; i < n; i++) {
120                 if (db_gen_init(&newp[i].gen) < 0) goto error;
121         }
122         
123         return newp;
124
125  error:
126         ERR("db_fld_copy() failed\n");
127         if (newp) {
128                 /* Free everything allocated in this function so far */
129                 while(i >= 0) {
130                         db_gen_free(&newp[i].gen);
131                         i--;
132                 }
133                 pkg_free(newp);
134         }
135         return NULL;
136 }
137
138
139 void db_fld_free(db_fld_t* fld)
140 {
141         int i;
142         
143         if (DB_FLD_EMPTY(fld)) return;
144         for(i = 0; !DB_FLD_LAST(fld[i]); i++) {
145                 db_gen_free(&fld[i].gen);
146         }
147         pkg_free(fld);
148 }
149
150 /** @} */