modules: several small doxygen bug fixes
[sip-router] / modules / db_mysql / km_my_con.c
1 /* 
2  * $Id$
3  *
4  * Copyright (C) 2001-2004 iptel.org
5  * Copyright (C) 2008 1&1 Internet AG
6  *
7  * This file is part of Kamailio, a free SIP server.
8  *
9  * Kamailio 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  * Kamailio is distributed in the hope that it will be useful,
15  * but WITHOUT ANY WARRANTY; without even the implied warranty of
16  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17  * GNU General Public License for more details.
18  *
19  * You should have received a copy of the GNU General Public License 
20  * along with this program; if not, write to the Free Software 
21  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
22  */
23
24 /*! \file
25  *  \brief DB_MYSQL :: Connections
26  *  \ingroup db_mysql
27  *  Module: \ref db_mysql
28  */
29
30
31 #include "km_my_con.h"
32 #include "km_db_mysql.h"
33 #include <mysql/mysql_version.h>
34 #include "../../mem/mem.h"
35 #include "../../dprint.h"
36 #include "../../ut.h"
37 #include "mysql_mod.h"
38
39 /*! \brief
40  * Create a new connection structure,
41  * open the MySQL connection and set reference count to 1
42  */
43 struct my_con* db_mysql_new_connection(const struct db_id* id)
44 {
45         struct my_con* ptr;
46         char *host, *grp;
47
48         if (!id) {
49                 LM_ERR("invalid parameter value\n");
50                 return 0;
51         }
52
53         ptr = (struct my_con*)pkg_malloc(sizeof(struct my_con));
54         if (!ptr) {
55                 LM_ERR("no private memory left\n");
56                 return 0;
57         }
58
59         memset(ptr, 0, sizeof(struct my_con));
60         ptr->ref = 1;
61         
62         ptr->con = (MYSQL*)pkg_malloc(sizeof(MYSQL));
63         if (!ptr->con) {
64                 LM_ERR("no private memory left\n");
65                 goto err;
66         }
67
68         mysql_init(ptr->con);
69
70         if (id->host[0] == '[' && (host = strchr(id->host, ']')) != NULL) {
71                 grp = id->host + 1;
72                 *host = '\0';
73                 if (host != id->host + strlen(id->host)-1) {
74                         host += 1; // host found after closing bracket
75                 }
76                 else {
77                         // let mysql read host info from my.cnf
78                         // (defaults to "localhost")
79                         host = NULL;
80                 }
81                 // read [client] and [<grp>] sections in the order
82                 // given in my.cnf
83                 mysql_options(ptr->con, MYSQL_READ_DEFAULT_GROUP, grp);
84         }
85         else {
86                 host = id->host;
87         }
88
89         if (id->port) {
90                 LM_DBG("opening connection: mysql://xxxx:xxxx@%s:%d/%s\n", ZSW(host),
91                         id->port, ZSW(id->database));
92         } else {
93                 LM_DBG("opening connection: mysql://xxxx:xxxx@%s/%s\n", ZSW(host),
94                         ZSW(id->database));
95         }
96
97         // set connect, read and write timeout, the value counts three times
98         mysql_options(ptr->con, MYSQL_OPT_CONNECT_TIMEOUT, (const char *)&db_mysql_timeout_interval);
99         mysql_options(ptr->con, MYSQL_OPT_READ_TIMEOUT, (const char *)&db_mysql_timeout_interval);
100         mysql_options(ptr->con, MYSQL_OPT_WRITE_TIMEOUT, (const char *)&db_mysql_timeout_interval);
101
102 #if (MYSQL_VERSION_ID >= 40100)
103         if (!mysql_real_connect(ptr->con, host, id->username, id->password,
104                                 id->database, id->port, 0, CLIENT_MULTI_STATEMENTS)) {
105 #else
106         if (!mysql_real_connect(ptr->con, host, id->username, id->password,
107                                 id->database, id->port, 0, 0)) {
108 #endif
109                 LM_ERR("driver error: %s\n", mysql_error(ptr->con));
110                 /* increase error counter */
111                 counter_inc(mysql_cnts_h.driver_err);
112                 mysql_close(ptr->con);
113                 goto err;
114         }
115         /* force reconnection if enabled */
116         if (db_mysql_auto_reconnect)
117                 ptr->con->reconnect = 1;
118         else 
119                 ptr->con->reconnect = 0;
120
121         LM_DBG("connection type is %s\n", mysql_get_host_info(ptr->con));
122         LM_DBG("protocol version is %d\n", mysql_get_proto_info(ptr->con));
123         LM_DBG("server version is %s\n", mysql_get_server_info(ptr->con));
124
125         ptr->timestamp = time(0);
126         ptr->id = (struct db_id*)id;
127         return ptr;
128
129  err:
130         if (ptr && ptr->con) pkg_free(ptr->con);
131         if (ptr) pkg_free(ptr);
132         return 0;
133 }
134
135
136 /*! \brief
137  * Close the connection and release memory
138  */
139 void db_mysql_free_connection(struct pool_con* con)
140 {
141         struct my_con * _c;
142         
143         if (!con) return;
144
145         _c = (struct my_con*) con;
146
147         if (_c->res) mysql_free_result(_c->res);
148         if (_c->id) free_db_id(_c->id);
149         if (_c->con) {
150                 mysql_close(_c->con);
151                 pkg_free(_c->con);
152         }
153         pkg_free(_c);
154 }