/*
* Copyright (C) 1999-2007 Andre Noll <maan@systemlinux.org>
*
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111, USA.
+ * Licensed under the GPL v2. For licencing details see COPYING.
*/
/** \file mysql_selector.c para_server's mysql-based audio file selector */
#include "server.cmdline.h"
#include "server.h"
#include "vss.h"
-#include "afs.h"
+#include "afs_common.h"
#include <mysql/mysql.h>
#include <mysql/mysql_version.h>
#include <regex.h>
#include "string.h"
#include "user_list.h"
#include "mysql_selector_command_list.h"
+#include "ipc.h"
/** pointer to the shared memory area */
extern struct misc_meta_data *mmd;
static void *mysql_ptr = NULL;
+static int mysql_lock;
/**
* contains name/replacement pairs used by s_a_r_list()
};
/**
- * simple search and replace routine
+ * Simple search and replace routine.
*
- * \param src source string
- * \param macro_name the name of the macro
- * \param replacement the replacement format string
+ * \param src Source String.
+ * \param macro_name The name of the macro.
+ * \param replacement The replacement format string.
*
* In \p src, replace each occurence of \p macro_name(arg) by the string
* determined by the \p replacement format string. \p replacement may (but
* replaced by \p arg.
*
* \return A string in which all matches in \p src are replaced, or \p NULL if
- * an syntax error was encountered. Caller must free the result.
+ * an error was encountered. Caller must free the result.
*
* \sa regcomp(3)
*/
if (!macro_name || !replacement || !src)
return para_strdup(src);
- regcomp(&preg, macro_name, 0);
+ if (regcomp(&preg, macro_name, 0) != 0)
+ return NULL;
while (regexec(&preg, bufptr, nmatch, pmatch, eflags)
!= REG_NOMATCH) {
char *tmp, *arg, *o_bracket, *c_bracket;
return ret;
}
-static int real_query(const char *query)
+static int lockless_real_query(const char *query)
{
if (!mysql_ptr)
return -E_NOTCONN;
return 1;
}
+static int real_query(const char *query)
+{
+ int ret;
+
+ mutex_lock(mysql_lock);
+ ret = lockless_real_query(query);
+ mutex_unlock(mysql_lock);
+ return ret;
+}
+
/*
* Use open connection given by mysql_ptr to query server. Returns a
* result pointer on succes and NULL on errors
*/
static struct MYSQL_RES *get_result(const char *query)
{
- void *result;
+ void *result = NULL;
- if (real_query(query) < 0)
- return NULL;
+ mutex_lock(mysql_lock);
+ if (lockless_real_query(query) < 0)
+ goto out;
result = mysql_store_result(mysql_ptr);
if (!result)
PARA_ERROR_LOG("%s", "store_result error\n");
+out:
+ mutex_unlock(mysql_lock);
return result;
}
/*
goto out;
}
if (vrfy_mode) {
- send_va_buffer(fd, "found %i invalid entr%s\n", num_rows,
+ send_va_buffer(fd, "found %lli invalid entr%s\n", num_rows,
num_rows == 1? "y" : "ies");
ret = print_results(fd, result, top, left, num_rows - 1, right);
goto out;
static void shutdown_connection(void)
{
+ int ret;
+
if (mysql_ptr) {
PARA_NOTICE_LOG("%s", "shutting down mysql connection\n");
mysql_close(mysql_ptr);
mysql_ptr = NULL;
}
+ if (mysql_lock) {
+ ret = mutex_destroy(mysql_lock);
+ if (ret < 0)
+ PARA_ERROR_LOG("%s\n", PARA_STRERROR(-ret));
+ mysql_lock = 0;
+ }
}
/**
db->get_audio_file_list = server_get_audio_file_list;
db->update_audio_file = update_audio_file_server_handler;
db->shutdown = shutdown_connection;
+ ret = mutex_new();
+ if (ret < 0)
+ return ret;
+ mysql_lock = ret;
ret = init_mysql_server();
if (ret < 0)
PARA_WARNING_LOG("%s\n", PARA_STRERROR(-ret));