Handle call forward on SIP
[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[128];
45   time_t t;
46
47
48   sqlcmd = (char *)malloc(2048);
49   memset(sqlcmd,0,2048);
50
51
52   gettimeofday(&tv,&tz);
53   t = tv.tv_sec;
54   tm = localtime(&t);
55   strftime(timestr,128,DATE_FORMAT,tm);
56   
57
58   ast_log(LOG_DEBUG,"cdr_mysql: inserting a CDR record.\n");
59   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);
60   
61   ast_log(LOG_DEBUG,"cdr_mysql: SQL command as follows:  %s\n",sqlcmd);
62   
63   if (mysql_real_query(mysql,sqlcmd,strlen(sqlcmd)))
64   {
65       ast_log(LOG_ERROR,"Failed to insert into database.");
66       free(sqlcmd);
67       return -1;
68   }
69   free(sqlcmd);
70   return 0;
71 }
72
73
74
75 char *description(void)
76 {
77   return desc;
78 }
79
80 int unload_module(void)
81
82
83   mysql_close(mysql);
84   ast_cdr_unregister(name);
85   return 0;
86 }
87
88 int load_module(void)
89 {
90   int res;
91   struct ast_config *cfg;
92   struct ast_variable *var;
93
94   char *hostname, *dbname, *dbuser, *password;
95
96   cfg = ast_load(config);
97   if (!cfg) {
98     ast_log(LOG_WARNING, "Unable to load config for mysql CDR's: %s\n", config);
99     return 0;
100   }
101   
102   var = ast_variable_browse(cfg, "global");
103   if (!var) {
104     /* nothing configured */
105     return 0;
106   }
107
108   hostname = ast_variable_retrieve(cfg,"global","hostname");
109   dbname = ast_variable_retrieve(cfg,"global","dbname");
110   dbuser = ast_variable_retrieve(cfg,"global","user");
111   password = ast_variable_retrieve(cfg,"global","password");
112   ast_log(LOG_DEBUG,"cdr_mysql: got hostname of %s\n",hostname);
113   ast_log(LOG_DEBUG,"cdr_mysql: got user of %s\n",dbuser);
114   ast_log(LOG_DEBUG,"cdr_mysql: got dbname of %s\n",dbname);
115   ast_log(LOG_DEBUG,"cdr_mysql: got password of %s\n",password);
116
117   if (hostname == NULL)
118     {
119       ast_log(LOG_ERROR,"Database server hostname not specified.\n");
120       return -1;
121     }
122   if (dbuser == NULL)
123     {
124       ast_log(LOG_ERROR,"Database dbuser not specified.\n");
125       return -1;
126     }
127   if (dbname == NULL)
128     {
129       ast_log(LOG_ERROR,"Database dbname not specified.\n");
130       return -1;
131     }
132   if (password == NULL)
133     {
134       ast_log(LOG_ERROR,"Database password not specified.\n");
135       return -1;
136     }
137
138
139   mysql = mysql_init(NULL);
140
141   mysql = mysql_real_connect(mysql, hostname, dbuser, password, dbname, 0, NULL, 0);
142
143   if (mysql == NULL) {
144     ast_log(LOG_ERROR, "Failed to connect to mysql database.\n");
145     return -1;
146   } else {
147     ast_log(LOG_DEBUG,"Successfully connected to MySQL database.\n");
148   }
149   
150
151   res = ast_cdr_register(name, desc, mysql_log);
152   if (res) {
153     ast_log(LOG_ERROR, "Unable to register MySQL CDR handling\n");
154   }
155   return res;
156 }
157
158 int reload(void)
159 {
160
161   struct ast_config *cfg;
162   struct ast_variable *var;
163
164   char *hostname, *dbname, *password, *dbuser;
165   
166   mysql_close(mysql);
167
168
169   cfg = ast_load(config);
170   if (!cfg) {
171     ast_log(LOG_WARNING, "Unable to load MySQL CDR config %s\n", config);
172     return 0;
173   }
174   
175   var = ast_variable_browse(cfg, "global");
176   if (!var) {
177     /* nothing configured */
178     return 0;
179   }
180
181   hostname = ast_variable_retrieve(cfg,"global","hostname");
182   dbname = ast_variable_retrieve(cfg,"global","dbname");
183   dbuser = ast_variable_retrieve(cfg,"global","user");
184   password = ast_variable_retrieve(cfg,"global","password");
185   ast_log(LOG_DEBUG,"cdr_mysql: got hostname of %s\n",hostname);
186   ast_log(LOG_DEBUG,"cdr_mysql: got dbname of %s\n",dbname);
187   ast_log(LOG_DEBUG,"cdr_mysql: got dbuser of %s\n",dbuser);
188   ast_log(LOG_DEBUG,"cdr_mysql: got password of %s\n",password);
189
190   if (hostname == NULL)
191     {
192       ast_log(LOG_ERROR,"Database server hostname not specified.\n");
193       return -1;
194     }
195   if (dbname == NULL)
196     {
197       ast_log(LOG_ERROR,"Database dbname not specified.\n");
198       return -1;
199     }
200   if (dbuser == NULL)
201     {
202       ast_log(LOG_ERROR,"Database dbuser not specified.\n");
203       return -1;
204     }
205   
206   if (password == NULL)
207     {
208       ast_log(LOG_ERROR,"Database password not specified.\n");
209       return -1;
210     }
211   
212  mysql = mysql_init(NULL);
213  
214  mysql = mysql_real_connect(mysql, hostname, dbuser, password, dbname, 0, NULL, 0);
215  
216  if (mysql == NULL) {
217    ast_log(LOG_ERROR, "Failed to connect to mysql database.\n");
218    return -1;
219  } else {
220    ast_log(LOG_DEBUG,"Successfully connected to MySQL database.\n");
221  }
222  
223
224
225
226   return 0;
227 }
228
229 int usecount(void)
230 {
231   return 0;
232 }
233
234 char *key()
235 {
236   return ASTERISK_GPL_KEY;
237 }