- Spelling checked
[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   "mysql://root@localhost/ser"
35 #define DB_TABLE "location"
36
37 #define TRUE 1
38 #define FALSE 0
39
40
41 /*
42  * Database 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                         case DB_BITMAP:
107                                 printf("%d ", RES_ROWS(_r)[i].values[j].val.bitmap_val);
108                                 break;
109                         }
110                         
111                 }
112                 printf("\n");
113         }
114                         
115         return TRUE;
116 }
117
118
119
120
121
122 struct module_exports* mod_register()
123 {
124              /*
125               * Column names of table location
126               */
127         db_key_t keys1[] = {"username", "contact", "q", "expire", "opaque", "flags" };
128         db_key_t keys2[] = {"username", "q"};
129         db_key_t keys3[] = {"username", "contact"};
130         db_key_t keys4[] = {"contact", "q"};
131
132         db_val_t vals1[] = { 
133                 { DB_STRING  , 0, { .string_val = "foo@bar.com" }              },
134                 { DB_STR     , 0, { .str_val    = { "real@foo.bar.com", 18 } } },
135                 { DB_DOUBLE  , 0, { .double_val = 1.2 }                        },
136                 { DB_DATETIME, 0, { .time_val   = 439826493 }                  },
137                 { DB_BLOB    , 0, { .blob_val   = { "hdslgkhas\0glksf", 17 } } },
138                 { DB_BITMAP  , 0, { .bitmap_val = FLAG_NAT | FLAG_INVITE }     }
139         };
140
141         db_val_t vals2[] = { 
142                 { DB_STRING  , 0, { .string_val = "foo2@bar2.com" }              },
143                 { DB_STR     , 0, { .str_val    = { "real2@foo.bar2.com", 18 } } },
144                 { DB_DOUBLE  , 0, { .double_val = 1.3 }                          },
145                 { DB_DATETIME, 0, { .time_val   = 12345 }                        },
146                 { DB_BLOB    , 0, { .blob_val   = { "\0a\0balkdfj", 10 }       } },
147                 { DB_BITMAP  , 0, { .bitmap_val = FLAG_NAT, FLAG_NOT_INVITE }    }
148         };
149
150         db_val_t vals3[] = { 
151                 { DB_STRING  , 0, { .string_val = "foo3@bar3.com" }              },
152                 { DB_STR     , 0, { .str_val    = { "real3@foo.bar3.com", 18 } } },
153                 { DB_DOUBLE  , 0, { .double_val = 1.5 }                          },
154                 { DB_DATETIME, 0, { .time_val   = 123456 }                       },
155                 { DB_BLOB    , 0, { .blob_val   = { "halgkasdg\'", 10 }        } },
156                 { DB_BITMAP  , 0, { .blob_val   = FLAG_NAT }                     }
157         };
158
159         db_val_t vals4[] = {
160                 { DB_STRING, 0, { .string_val = "foo2@bar2.com" } },
161                 { DB_DOUBLE, 0, { .double_val = 1.30 }            }
162         };
163                   
164         db_val_t vals5[] = {
165                 { DB_STRING, 0, { .string_val = "foo3@bar3.com" }      },
166                 { DB_STRING, 0, { .string_val = "real3@foo.bar3.com" } }
167         };
168
169         db_val_t vals6[] = {
170                 { DB_STRING, 0, { .string_val = "different@address.com" } },
171                 { DB_DOUBLE, 0, { .double_val = 2.5 }                     }
172         };
173
174         db_con_t* h;
175         db_res_t* res;
176
177         fprintf(stderr, "DBExample - registering...\n");
178
179              /* The first call must be bind_dbmod
180               * This call will search for functions
181               * exported by a database module
182               */
183         if (bind_dbmod()) {
184                 fprintf(stderr, "Error while binding database module, did you forget to load a database module ?\n");
185                 return &dbex_exports;
186         }
187
188              /*
189               * Create a database connection
190               * DB_URL is database URL of form
191               * mysql://user:password@host:port/database
192               * The function returns handle, that
193               * represents a database connection
194               */
195         h = db_init(DB_URL);
196         if (!h) {
197                 fprintf(stderr, "Error while initializing database connection\n");
198                 return &dbex_exports;
199         }
200
201              /* 
202               * Specify a table name, that will
203               * be used for manipulations
204               */
205         if (db_use_table(h, DB_TABLE) < 0) {
206                 fprintf(stderr, "Error while calling db_use_table\n");
207                 return &dbex_exports;
208         }
209
210              /* If you do not specify any keys and values to be
211               * matched, all rows will be deleted
212               */
213         if (db_delete(h, NULL, NULL, NULL, 0) < 0) {
214                 fprintf(stderr, "Error while flushing table\n");
215                 return &dbex_exports;
216         }
217
218         if (db_insert(h, keys1, vals1, 6) < 0) {
219                 fprintf(stderr, "Error while inserting line 1\n");
220                 return &dbex_exports;
221         }
222
223         if (db_insert(h, keys1, vals2, 6) < 0) {
224                 fprintf(stderr, "Error while inserting line 2\n");
225                 return &dbex_exports;
226         }
227
228         if (db_insert(h, keys1, vals3, 6) < 0) {
229                 fprintf(stderr, "Error while inserting line 3\n");
230                 return &dbex_exports;
231         }
232
233              /*
234               * Let's delete middle line with
235               * user = foo2@bar2.com and q = 1.3
236               */
237         if (db_delete(h, keys2, NULL, vals4, 2) < 0) {
238                 fprintf(stderr, "Error while deleting line\n");
239                 return &dbex_exports;
240         }
241
242              /*
243               * Modify last line
244               */
245         if (db_update(h, keys3, NULL, vals5, keys4, vals6, 2, 2) < 0) {
246                 fprintf(stderr, "Error while modifying table\n");
247                 return &dbex_exports;
248         }
249
250              /*
251               * Last but not least, dump the result of db_query
252               */
253
254         if (db_query(h, NULL, NULL, NULL, NULL, 0, 0, NULL, &res) < 0) {
255                 fprintf(stderr, "Error while querying table\n");
256                 return &dbex_exports;
257         }
258
259
260         print_res(res);
261
262              /*
263               * Free the result because we don't need it
264               * anymore
265               */
266         if (db_free_result(h, res) < 0) {
267                 fprintf(stderr, "Error while freeing result of query\n");
268                 return &dbex_exports;
269         }
270
271              /*
272               * Close existing database connection
273               * and free previously allocated 
274               * memory
275               */
276         db_close(h);
277         return &dbex_exports;
278 }