/* Connect to the MYSQL database */ static logsql_opendb_ret log_sql_mysql_connect(server_rec *s, logsql_dbconnection *db) { const char *host = apr_table_get(db->parms,"hostname"); const char *user = apr_table_get(db->parms,"username"); const char *passwd = apr_table_get(db->parms,"password"); const char *database = apr_table_get(db->parms,"database"); const char *s_tcpport = apr_table_get(db->parms,"port"); unsigned int tcpport = (s_tcpport)?atoi(s_tcpport):3306; const char *socketfile = apr_table_get(db->parms,"socketfile"); MYSQL *dblink = db->handle; dblink = mysql_init(dblink); db->handle = (void *)dblink; if (!socketfile) { socketfile = "/var/lib/mysql/mysql.sock"; } if (mysql_real_connect(dblink, host, user, passwd, database, tcpport, socketfile, 0)) { log_error(APLOG_MARK,APLOG_DEBUG,0, s,"HOST: '%s' PORT: '%d' DB: '%s' USER: '******' SOCKET: '%s'", host, tcpport, database, user, socketfile); return LOGSQL_OPENDB_SUCCESS; } else { log_error(APLOG_MARK,APLOG_ERR,0, s,"mod_log_sql_mysql: database connection error: mysql error: %s", MYSQL_ERROR(dblink)); log_error(APLOG_MARK,APLOG_DEBUG, 0, s,"HOST: '%s' PORT: '%d' DB: '%s' USER: '******' SOCKET: '%s'", host, tcpport, database, user, socketfile); return LOGSQL_OPENDB_FAIL; } }
static MYSQL *doConnect(URL_T url, char **error) { #define MYSQL_ERROR(e) do {*error = Str_dup(e); goto error;} while (0) int port; my_bool yes = 1; my_bool no = 0; volatile int connectTimeout = SQL_DEFAULT_TCP_TIMEOUT; unsigned long clientFlags = CLIENT_MULTI_STATEMENTS; const char *user, *password, *host, *database, *charset, *timeout; const char *unix_socket = URL_getParameter(url, "unix-socket"); MYSQL *db = mysql_init(NULL); if (! db) { *error = Str_dup("unable to allocate mysql handler"); return NULL; } if (! (user = URL_getUser(url))) if (! (user = URL_getParameter(url, "user"))) MYSQL_ERROR("no username specified in URL"); if (! (password = URL_getPassword(url))) if (! (password = URL_getParameter(url, "password"))) MYSQL_ERROR("no password specified in URL"); if (unix_socket) { host = "localhost"; // Make sure host is localhost if unix socket is to be used } else if (! (host = URL_getHost(url))) MYSQL_ERROR("no host specified in URL"); if ((port = URL_getPort(url)) <= 0) MYSQL_ERROR("no port specified in URL"); if (! (database = URL_getPath(url))) MYSQL_ERROR("no database specified in URL"); else database++; /* Options */ if (IS(URL_getParameter(url, "compress"), "true")) clientFlags |= CLIENT_COMPRESS; if (IS(URL_getParameter(url, "use-ssl"), "true")) mysql_ssl_set(db, 0,0,0,0,0); if (IS(URL_getParameter(url, "secure-auth"), "true")) mysql_options(db, MYSQL_SECURE_AUTH, (const char*)&yes); else mysql_options(db, MYSQL_SECURE_AUTH, (const char*)&no); if ((timeout = URL_getParameter(url, "connect-timeout"))) { TRY connectTimeout = Str_parseInt(timeout); ELSE MYSQL_ERROR("invalid connect timeout value"); END_TRY; } mysql_options(db, MYSQL_OPT_CONNECT_TIMEOUT, (const char*)&connectTimeout); if ((charset = URL_getParameter(url, "charset"))) mysql_options(db, MYSQL_SET_CHARSET_NAME, charset); #if MYSQL_VERSION_ID >= 50013 mysql_options(db, MYSQL_OPT_RECONNECT, (const char*)&yes); #endif /* Connect */ if (mysql_real_connect(db, host, user, password, database, port, unix_socket, clientFlags)) return db; *error = Str_dup(mysql_error(db)); error: mysql_close(db); return NULL; }