]> git.sur5r.net Git - bacula/bacula/commitdiff
Final fix of bug #1943
authorMarco van Wieringen <mvw@planets.elm.net>
Sat, 10 Nov 2012 09:36:10 +0000 (10:36 +0100)
committerKern Sibbald <kern@sibbald.com>
Sat, 20 Apr 2013 12:51:03 +0000 (14:51 +0200)
We cannot check if the db is connected in the library as that has no
full B_DB class structure. So we now check the connected state of
the database connection in the escape and insert handler which are
registered by the director.

bacula/src/dird/dird.c
bacula/src/lib/message.c
bacula/src/lib/message.h

index 07ad49db54a82db95f89dfed9f1e37da8c68e715..4596d980e14598b16ce6039c7547cb1731e58a58 100644 (file)
@@ -65,7 +65,6 @@ extern int job_setattr(PyObject *self, char *attrname, PyObject *value);
 /* Forward referenced subroutines */
 void terminate_dird(int sig);
 static bool check_resources();
-static void dir_sql_query(JCR *jcr, const char *cmd);
 static void cleanup_old_files();
   
 /* Exported subroutines */
@@ -117,6 +116,32 @@ static bool check_catalog(cat_op mode);
 
 #define CONFIG_FILE "bacula-dir.conf" /* default configuration file */
 
+/*
+ * This allows the message handler to operate on the database
+ *   by using a pointer to this function. The pointer is
+ *   needed because the other daemons do not have access
+ *   to the database.  If the pointer is
+ *   not defined (other daemons), then writing the database
+ *   is disabled.
+ */
+static bool dir_sql_query(JCR *jcr, const char *cmd)
+{
+   if (!jcr || !jcr->db || !jcr->db->is_connected()) {
+      return false;
+   }
+
+   return db_sql_query(jcr->db, cmd);
+}
+
+static bool dir_sql_escape(JCR *jcr, B_DB *mdb, char *snew, char *old, int len)
+{
+   if (!jcr || !jcr->db || !jcr->db->is_connected()) {
+      return false;
+   }
+
+   db_escape_string(jcr, mdb, snew, old, len);
+   return true;
+}
 
 static void usage()
 {
@@ -313,7 +338,7 @@ int main (int argc, char *argv[])
 
    /* Plug database interface for library routines */
    p_sql_query = (sql_query_func)dir_sql_query;
-   p_sql_escape = (sql_escape_func)db_escape_string;
+   p_sql_escape = (sql_escape_func)dir_sql_escape;
 
    FDConnectTimeout = (int)director->FDConnectTimeout;
    SDConnectTimeout = (int)director->SDConnectTimeout;
@@ -365,22 +390,6 @@ int main (int argc, char *argv[])
    return 0;
 }
 
-/*
- * This allows the message handler to operate on the database
- *   by using a pointer to this function. The pointer is
- *   needed because the other daemons do not have access
- *   to the database.  If the pointer is
- *   not defined (other daemons), then writing the database
- *   is disabled. 
- */
-static void dir_sql_query(JCR *jcr, const char *cmd)
-{
-   if (!jcr || !jcr->db) {
-      return;
-   }
-   db_sql_query(jcr->db, cmd, NULL, NULL);
-}
-
 /* Cleanup and then exit */
 void terminate_dird(int sig)
 {
index c51056348831d16f9282a1aeba9ace0cc340b181..82c5b4ef41d26f40da7f618a4c588a43b06c9ed6 100644 (file)
@@ -817,7 +817,7 @@ void dispatch_message(JCR *jcr, int type, utime_t mtime, char *msg)
           switch (d->dest_code) {
              case MD_CATALOG:
                 char ed1[50];
-                if (!jcr || !jcr->db || !jcr->db->is_connected()) {
+                if (!jcr || !jcr->db) {
                    break;
                 }
                 if (p_sql_query && p_sql_escape) {
@@ -826,12 +826,16 @@ void dispatch_message(JCR *jcr, int type, utime_t mtime, char *msg)
                    
                    int len = strlen(msg) + 1;
                    esc_msg = check_pool_memory_size(esc_msg, len * 2 + 1);
-                   p_sql_escape(jcr, jcr->db, esc_msg, msg, len);
-
-                   bstrutime(dt, sizeof(dt), mtime);
-                   Mmsg(cmd, "INSERT INTO Log (JobId, Time, LogText) VALUES (%s,'%s','%s')",
-                         edit_int64(jcr->JobId, ed1), dt, esc_msg);
-                   p_sql_query(jcr, cmd);
+                   if (p_sql_escape(jcr, jcr->db, esc_msg, msg, len)) {
+                      bstrutime(dt, sizeof(dt), mtime);
+                      Mmsg(cmd, "INSERT INTO Log (JobId, Time, LogText) VALUES (%s,'%s','%s')",
+                            edit_int64(jcr->JobId, ed1), dt, esc_msg);
+                      if (!p_sql_query(jcr, cmd)) {
+                         delivery_error(_("Msg delivery error: Unable to store data in database.\n"));
+                      }
+                   } else {
+                      delivery_error(_("Msg delivery error: Unable to store data in database.\n"));
+                   }
                    
                    free_pool_memory(cmd);
                    free_pool_memory(esc_msg);
index e3fb1e5a49d9ce6e63ecad5a953d66b1760bc82a..20cad236c5bf567f2317ed036ea49ca147839ef0 100644 (file)
@@ -148,8 +148,8 @@ bool get_trace(void);
 const char *get_basename(const char *pathname);
 
 class B_DB;
-typedef void (*sql_query_func)(JCR *jcr, const char *cmd);
-typedef void (*sql_escape_func)(JCR *jcr, B_DB* db, char *snew, char *old, int len);
+typedef bool (*sql_query_func)(JCR *jcr, const char *cmd);
+typedef bool (*sql_escape_func)(JCR *jcr, B_DB *db, char *snew, char *old, int len);
 
 extern DLL_IMP_EXP sql_query_func     p_sql_query;
 extern DLL_IMP_EXP sql_escape_func    p_sql_escape;