GPLization banner introduced to *.[hc] files
[sip-router] / db / example / dbexample.c
1 /*
2  * $Id$
3  *
4  * Copyright (C) 2001-2003 Fhg Fokus
5  *
6  * This file is part of ser, a free SIP server.
7  *
8  * ser is free software; you can redistribute it and/or modify
9  * it under the terms of the GNU General Public License as published by
10  * the Free Software Foundation; either version 2 of the License, or
11  * (at your option) any later version
12  *
13  * For a license to use the ser software under conditions
14  * other than those described here, or to purchase support for this
15  * software, please contact iptel.org by e-mail at the following addresses:
16  *    info@iptel.org
17  *
18  * ser is distributed in the hope that it will be useful,
19  * but WITHOUT ANY WARRANTY; without even the implied warranty of
20  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
21  * GNU General Public License for more details.
22  *
23  * You should have received a copy of the GNU General Public License 
24  * along with this program; if not, write to the Free Software 
25  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
26  */
27
28
29 #include "../../sr_module.h"
30 #include <stdio.h>
31 #include "../../db/db.h"
32
33
34 #define DB_URL   "sql://root@localhost/ser"
35 #define DB_TABLE "location"
36
37 #define TRUE 1
38 #define FALSE 0
39
40
41 /*
42  * Dabase module client example
43  */
44
45
46 static struct module_exports dbex_exports= {    
47         "DBExample", 
48         (char*[]) {
49         },
50         (cmd_function[]) {
51         },
52         (int[]) {
53         },
54         (fixup_function[]) {
55         },
56         0,       /* number of functions*/
57         NULL,    /* Module parameter names */
58         NULL,    /* Module parameter types */
59         NULL,    /* Module parameter variable pointers */
60         0,       /* Number of module parameters */
61         0,       /* response function*/
62         0        /* destroy function */
63 };
64
65
66 static int print_res(db_res_t* _r)
67 {
68         int i, j;
69
70         for(i = 0; i < RES_COL_N(_r); i++) {
71                 printf("%s ", RES_NAMES(_r)[i]);
72         }
73         printf("\n");
74
75         for(i = 0; i < RES_ROW_N(_r); i++) {
76                 for(j = 0; j < RES_COL_N(_r); j++) {
77                         if (RES_ROWS(_r)[i].values[j].nul == TRUE) {
78                                 printf("NULL ");
79                                 continue;
80                         }
81                         switch(RES_ROWS(_r)[i].values[j].type) {
82                         case DB_INT:
83                                 printf("%d ", RES_ROWS(_r)[i].values[j].val.int_val);
84                                 break;
85                         case DB_DOUBLE:
86                                 printf("%f ", RES_ROWS(_r)[i].values[j].val.double_val);
87                                 break;
88                         case DB_DATETIME:
89                                 printf("%s ", ctime(&(RES_ROWS(_r)[i].values[j].val.time_val)));
90                                 break;
91                         case DB_STRING:
92                                 printf("%s ", RES_ROWS(_r)[i].values[j].val.string_val);
93                                 break;
94                         case DB_STR:
95                                 printf("%.*s ", 
96                                        RES_ROWS(_r)[i].values[j].val.str_val.len,
97                                        RES_ROWS(_r)[i].values[j].val.str_val.s);
98                                 break;
99
100                         case DB_BLOB:
101                                 printf("%.*s ",
102                                        RES_ROWS(_r)[i].values[j].val.blob_val.len,
103                                        RES_ROWS(_r)[i].values[j].val.blob_val.s);
104                                 break;
105                         }
106                         
107                 }
108                 printf("\n");
109         }
110                         
111         return TRUE;
112 }
113
114
115
116
117
118 struct module_exports* mod_register()
119 {
120              /*
121               * Column names of table location
122               */
123         db_key_t keys1[] = {"user", "contact", "q", "expire", "opaque" };
124         db_key_t keys2[] = {"user", "q"};
125         db_key_t keys3[] = {"user", "contact"};
126         db_key_t keys4[] = {"contact", "q"};
127
128         db_val_t vals1[] = { 
129                 { DB_STRING  , 0, { .string_val = "foo@bar.com" }              },
130                 { DB_STR     , 0, { .str_val    = { "real@foo.bar.com", 18 } } },
131                 { DB_DOUBLE  , 0, { .double_val = 1.2 }                        },
132                 { DB_DATETIME, 0, { .time_val   = 439826493 }                  },
133                 { DB_BLOB    , 0, { .blob_val   = { "hdslgkhas\0glksf", 17 } } }
134         };
135
136         db_val_t vals2[] = { 
137                 { DB_STRING  , 0, { .string_val = "foo2@bar2.com" }              },
138                 { DB_STR     , 0, { .str_val    = { "real2@foo.bar2.com", 18 } } },
139                 { DB_DOUBLE  , 0, { .double_val = 1.3 }                          },
140                 { DB_DATETIME, 0, { .time_val   = 12345 }                        },
141                 { DB_BLOB    , 0, { .blob_val   = { "\0a\0balkdfj", 10 }       } }
142         };
143
144         db_val_t vals3[] = { 
145                 { DB_STRING  , 0, { .string_val = "foo3@bar3.com" }              },
146                 { DB_STR     , 0, { .str_val    = { "real3@foo.bar3.com", 18 } } },
147                 { DB_DOUBLE  , 0, { .double_val = 1.5 }                          },
148                 { DB_DATETIME, 0, { .time_val   = 123456 }                       },
149                 { DB_BLOB    , 0, { .blob_val   = { "halgkasdg\'", 10 }        } }
150         };
151
152         db_val_t vals4[] = {
153                 { DB_STRING, 0, { .string_val = "foo2@bar2.com" } },
154                 { DB_DOUBLE, 0, { .double_val = 1.30 }            }
155         };
156                   
157         db_val_t vals5[] = {
158                 { DB_STRING, 0, { .string_val = "foo3@bar3.com" }      },
159                 { DB_STRING, 0, { .string_val = "real3@foo.bar3.com" } }
160         };
161
162         db_val_t vals6[] = {
163                 { DB_STRING, 0, { .string_val = "different@address.com" } },
164                 { DB_DOUBLE, 0, { .double_val = 2.5 }                     }
165         };
166
167         db_con_t* h;
168         db_res_t* res;
169
170         fprintf(stderr, "DBExample - registering...\n");
171
172              /* The first call must be bind_dbmod
173               * This call will search for functions
174               * exported by a database module
175               */
176         if (bind_dbmod()) {
177                 fprintf(stderr, "Error while binding database module, did you forget to load a database module ?\n");
178                 return &dbex_exports;
179         }
180
181              /*
182               * Create a database connection
183               * DB_URL is database URL of form
184               * sql://user:password@host:port/database
185               * The function returns handle, that
186               * represents a database connection
187               */
188         h = db_init(DB_URL);
189         if (!h) {
190                 fprintf(stderr, "Error while initializing database connection\n");
191                 return &dbex_exports;
192         }
193
194              /* 
195               * Specify a table name, that will
196               * be used for manipulations
197               */
198         if (db_use_table(h, DB_TABLE) < 0) {
199                 fprintf(stderr, "Error while calling db_use_table\n");
200                 return &dbex_exports;
201         }
202
203              /* If you do not specify any keys and values to be
204               * matched, all rows will be deleted
205               */
206         if (db_delete(h, NULL, NULL, 0) < 0) {
207                 fprintf(stderr, "Error while flushing table\n");
208                 return &dbex_exports;
209         }
210
211         if (db_insert(h, keys1, vals1, 5) < 0) {
212                 fprintf(stderr, "Error while inserting line 1\n");
213                 return &dbex_exports;
214         }
215
216         if (db_insert(h, keys1, vals2, 5) < 0) {
217                 fprintf(stderr, "Error while inserting line 2\n");
218                 return &dbex_exports;
219         }
220
221         if (db_insert(h, keys1, vals3, 5) < 0) {
222                 fprintf(stderr, "Error while inserting line 3\n");
223                 return &dbex_exports;
224         }
225
226              /*
227               * Let's delete middle line with
228               * user = foo2@bar2.com and q = 1.3
229               */
230         if (db_delete(h, keys2, vals4, 2) < 0) {
231                 fprintf(stderr, "Error while deleting line\n");
232                 return &dbex_exports;
233         }
234
235              /*
236               * Modify last line
237               */
238         if (db_update(h, keys3, vals5, keys4, vals6, 2, 2) < 0) {
239                 fprintf(stderr, "Error while modifying table\n");
240                 return &dbex_exports;
241         }
242
243              /*
244               * Last but not least, dump the result of db_query
245               */
246
247         if (db_query(h, NULL, NULL, NULL, 0, 0, NULL, &res) < 0) {
248                 fprintf(stderr, "Error while querying table\n");
249                 return &dbex_exports;
250         }
251
252
253         print_res(res);
254
255              /*
256               * Free the result because we don't need it
257               * anymore
258               */
259         if (db_free_query(h, res) < 0) {
260                 fprintf(stderr, "Error while freeing result of query\n");
261                 return &dbex_exports;
262         }
263
264              /*
265               * Close existing database connection
266               * and free previously allocated 
267               * memory
268               */
269         db_close(h);
270         return &dbex_exports;
271 }