net.c: Improve documentation of struct crypt_data.
[paraslash.git] / mysql_selector.c
index 8148fabe04310739a577b99add1783de94f0f14d..bbc05bdf39ddcf9a4f8e9c503d3d21efff72ae67 100644 (file)
 #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 %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;
                        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));