Version 0.3.0 from FTP
[asterisk/asterisk.git] / cdr / cdr_mysql.c
1 /*
2  * Asterisk -- A telephony toolkit for Linux.
3  *
4  * MySQL CDR logger 
5  * 
6  * James Sharp <jsharp@psychoses.org>
7  *
8  * This program is free software, distributed under the terms of
9  * the GNU General Public License.
10  *
11  */
12
13
14 #include <asterisk/config.h>
15 #include <asterisk/options.h>
16 #include <asterisk/channel.h>
17 #include <asterisk/cdr.h>
18 #include <asterisk/module.h>
19 #include <asterisk/logger.h>
20 #include "../asterisk.h"
21
22 #include <stdio.h>
23 #include <string.h>
24
25 #include <stdlib.h>
26 #include <unistd.h>
27 #include <time.h>
28
29 #include <mysql.h>
30
31 #define DATE_FORMAT "%Y-%m-%d %T"
32
33 static char *desc = "MySQL CDR Backend";
34 static char *name = "mysql";
35 static char *config = "cdr_mysql.conf";
36
37 static MYSQL *mysql;
38
39 static int mysql_log(struct ast_cdr *cdr)
40 {
41   struct tm *tm;
42   struct timeval *tv;
43   struct timezone *tz;
44   char *sqlcmd, *timestr;
45   time_t t;
46
47
48   tv = (struct timeval *)malloc(sizeof(struct timeval));
49   tz = (struct timezone *)malloc(sizeof(struct timezone));
50   sqlcmd = (char *)malloc(2048);
51   timestr = (char*)malloc(128);
52   memset(sqlcmd,0,2048);
53
54
55   gettimeofday(tv,tz);
56   t = tv->tv_sec;
57   tm = localtime(&t);
58   strftime(timestr,128,DATE_FORMAT,tm);
59   
60
61   ast_log(LOG_DEBUG,"cdr_mysql: inserting a CDR record.\n");
62   sprintf(sqlcmd,"INSERT INTO cdr (calldate,clid,src,dst,dcontext,channel,dstchannel,lastapp,lastdata,duration,billsec,disposition,amaflags,accountcode) VALUES ('%s','%s','%s','%s','%s', '%s','%s','%s','%s',%i,%i,%i,%i,'%s')",timestr,cdr->clid,cdr->src, cdr->dst, cdr->dcontext,cdr->channel, cdr->dstchannel, cdr->lastapp, cdr->lastdata,cdr->duration,cdr->billsec,cdr->disposition,cdr->amaflags, cdr->accountcode);
63   
64   ast_log(LOG_DEBUG,"cdr_mysql: SQL command as follows:  %s\n",sqlcmd);
65   
66   if (mysql_real_query(mysql,sqlcmd,strlen(sqlcmd)))
67   {
68       ast_log(LOG_ERROR,"Failed to insert into database.");
69       free(sqlcmd);
70       return -1;
71   }
72   free(sqlcmd);
73   return 0;
74 }
75
76
77
78 char *description(void)
79 {
80   return desc;
81 }
82
83 int unload_module(void)
84
85
86   mysql_close(mysql);
87   ast_cdr_unregister(name);
88   return 0;
89 }
90
91 int load_module(void)
92 {
93   int res;
94   struct ast_config *cfg;
95   struct ast_variable *var;
96
97   char *hostname, *dbname, *dbuser, *password;
98
99   cfg = ast_load(config);
100   if (!cfg) {
101     ast_log(LOG_WARNING, "Unable to load config for mysql CDR's: %s\n", config);
102     return 0;
103   }
104   
105   var = ast_variable_browse(cfg, "global");
106   if (!var) {
107     /* nothing configured */
108     return 0;
109   }
110
111   hostname = ast_variable_retrieve(cfg,"global","hostname");
112   dbname = ast_variable_retrieve(cfg,"global","dbname");
113   dbuser = ast_variable_retrieve(cfg,"global","user");
114   password = ast_variable_retrieve(cfg,"global","password");
115   ast_log(LOG_DEBUG,"cdr_mysql: got hostname of %s\n",hostname);
116   ast_log(LOG_DEBUG,"cdr_mysql: got user of %s\n",dbuser);
117   ast_log(LOG_DEBUG,"cdr_mysql: got dbname of %s\n",dbname);
118   ast_log(LOG_DEBUG,"cdr_mysql: got password of %s\n",password);
119
120   if (hostname == NULL)
121     {
122       ast_log(LOG_ERROR,"Database server hostname not specified.\n");
123       return -1;
124     }
125   if (dbuser == NULL)
126     {
127       ast_log(LOG_ERROR,"Database dbuser not specified.\n");
128       return -1;
129     }
130   if (dbname == NULL)
131     {
132       ast_log(LOG_ERROR,"Database dbname not specified.\n");
133       return -1;
134     }
135   if (password == NULL)
136     {
137       ast_log(LOG_ERROR,"Database password not specified.\n");
138       return -1;
139     }
140
141
142   mysql = mysql_init(NULL);
143
144   mysql = mysql_real_connect(mysql, hostname, dbuser, password, dbname, 0, NULL, 0);
145
146   if (mysql == NULL) {
147     ast_log(LOG_ERROR, "Failed to connect to mysql database.\n");
148     return -1;
149   } else {
150     ast_log(LOG_DEBUG,"Successfully connected to MySQL database.\n");
151   }
152   
153
154   res = ast_cdr_register(name, desc, mysql_log);
155   if (res) {
156     ast_log(LOG_ERROR, "Unable to register MySQL CDR handling\n");
157   }
158   return res;
159 }
160
161 int reload(void)
162 {
163
164   struct ast_config *cfg;
165   struct ast_variable *var;
166
167   char *hostname, *dbname, *password, *dbuser;
168   
169   mysql_close(mysql);
170
171
172   cfg = ast_load(config);
173   if (!cfg) {
174     ast_log(LOG_WARNING, "Unable to load MySQL CDR config %s\n", config);
175     return 0;
176   }
177   
178   var = ast_variable_browse(cfg, "global");
179   if (!var) {
180     /* nothing configured */
181     return 0;
182   }
183
184   hostname = ast_variable_retrieve(cfg,"global","hostname");
185   dbname = ast_variable_retrieve(cfg,"global","dbname");
186   dbuser = ast_variable_retrieve(cfg,"global","user");
187   password = ast_variable_retrieve(cfg,"global","password");
188   ast_log(LOG_DEBUG,"cdr_mysql: got hostname of %s\n",hostname);
189   ast_log(LOG_DEBUG,"cdr_mysql: got dbname of %s\n",dbname);
190   ast_log(LOG_DEBUG,"cdr_mysql: got dbuser of %s\n",dbuser);
191   ast_log(LOG_DEBUG,"cdr_mysql: got password of %s\n",password);
192
193   if (hostname == NULL)
194     {
195       ast_log(LOG_ERROR,"Database server hostname not specified.\n");
196       return -1;
197     }
198   if (dbname == NULL)
199     {
200       ast_log(LOG_ERROR,"Database dbname not specified.\n");
201       return -1;
202     }
203   if (dbuser == NULL)
204     {
205       ast_log(LOG_ERROR,"Database dbuser not specified.\n");
206       return -1;
207     }
208   
209   if (password == NULL)
210     {
211       ast_log(LOG_ERROR,"Database password not specified.\n");
212       return -1;
213     }
214   
215  mysql = mysql_init(NULL);
216  
217  mysql = mysql_real_connect(mysql, hostname, dbuser, password, dbname, 0, NULL, 0);
218  
219  if (mysql == NULL) {
220    ast_log(LOG_ERROR, "Failed to connect to mysql database.\n");
221    return -1;
222  } else {
223    ast_log(LOG_DEBUG,"Successfully connected to MySQL database.\n");
224  }
225  
226
227
228
229   return 0;
230 }
231
232 int usecount(void)
233 {
234   return 0;
235 }
236
237 char *key()
238 {
239   return ASTERISK_GPL_KEY;
240 }