projects
/
paraslash.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
net.c: Improve documentation of struct crypt_data.
[paraslash.git]
/
mysql_selector.c
diff --git
a/mysql_selector.c
b/mysql_selector.c
index 8148fabe04310739a577b99add1783de94f0f14d..bbc05bdf39ddcf9a4f8e9c503d3d21efff72ae67 100644
(file)
--- a/
mysql_selector.c
+++ b/
mysql_selector.c
@@
-22,11
+22,13
@@
#include "string.h"
#include "user_list.h"
#include "mysql_selector_command_list.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;
/** 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()
/**
* contains name/replacement pairs used by s_a_r_list()
@@
-65,11
+67,11
@@
static const struct para_macro mysql_macro_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
*
* 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
@@
-77,7
+79,7
@@
static const struct para_macro mysql_macro_list[] = {
* replaced by \p arg.
*
* \return A string in which all matches in \p src are replaced, or \p NULL if
* 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)
*/
*
* \sa regcomp(3)
*/
@@
-93,7
+95,8
@@
__must_check __malloc static char *s_a_r(const char *src, const char* macro_name
if (!macro_name || !replacement || !src)
return para_strdup(src);
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;
while (regexec(&preg, bufptr, nmatch, pmatch, eflags)
!= REG_NOMATCH) {
char *tmp, *arg, *o_bracket, *c_bracket;
@@
-152,7
+155,7
@@
__must_check __malloc static char *s_a_r_list(const struct para_macro *macro_lis
return ret;
}
return ret;
}
-static int real_query(const char *query)
+static int
lockless_
real_query(const char *query)
{
if (!mysql_ptr)
return -E_NOTCONN;
{
if (!mysql_ptr)
return -E_NOTCONN;
@@
-165,19
+168,32
@@
static int real_query(const char *query)
return 1;
}
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)
{
/*
* 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");
result = mysql_store_result(mysql_ptr);
if (!result)
PARA_ERROR_LOG("%s", "store_result error\n");
+out:
+ mutex_unlock(mysql_lock);
return result;
}
/*
return result;
}
/*
@@
-1947,7
+1963,7
@@
static int com_vrfy_clean(int fd, int argc, __a_unused char *argv[])
goto out;
}
if (vrfy_mode) {
goto out;
}
if (vrfy_mode) {
- send_va_buffer(fd, "found %i invalid entr%s\n", num_rows,
+ send_va_buffer(fd, "found %
ll
i invalid entr%s\n", num_rows,
num_rows == 1? "y" : "ies");
ret = print_results(fd, result, top, left, num_rows - 1, right);
goto out;
num_rows == 1? "y" : "ies");
ret = print_results(fd, result, top, left, num_rows - 1, right);
goto out;
@@
-2244,11
+2260,19
@@
out:
static void shutdown_connection(void)
{
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_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;
+ }
}
/**
}
/**
@@
-2280,6
+2304,10
@@
int mysql_selector_init(struct audio_file_selector *db)
db->get_audio_file_list = server_get_audio_file_list;
db->update_audio_file = update_audio_file_server_handler;
db->shutdown = shutdown_connection;
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));
ret = init_mysql_server();
if (ret < 0)
PARA_WARNING_LOG("%s\n", PARA_STRERROR(-ret));