/*
  * Note, if this routine returns 1 (failure), Bacula expects
  *  that no result has been stored.
+ * This is where QUERY_DB comes with Postgresql.
+ *
+ *  Returns:  0  on success
+ *            1  on failure
+ *
  */
-int my_postgresql_query(B_DB *mdb, const char *query) {
+int my_postgresql_query(B_DB *mdb, const char *query)
+{
    Dmsg0(500, "my_postgresql_query started\n");
    // We are starting a new query.  reset everything.
    mdb->num_rows     = -1;
    }
 
    Dmsg1(500, "my_postgresql_query starts with '%s'\n", query);
-   mdb->result = PQexec(mdb->db, query);
+
+   for (int i=0; i < 10; i++) {
+      mdb->result = PQexec(mdb->db, query);
+      if (mdb->result) {
+         break;
+      }
+      bmicrosleep(5, 0);
+   }
+   if (!mdb->result) {
+      goto bail_out;
+   }
+
    mdb->status = PQresultStatus(mdb->result);
    if (mdb->status == PGRES_TUPLES_OK || mdb->status == PGRES_COMMAND_OK) {
       Dmsg1(500, "we have a result\n", query);
 
       // how many fields in the set?
-      mdb->num_fields = (int) PQnfields(mdb->result);
+      mdb->num_fields = (int)PQnfields(mdb->result);
       Dmsg1(500, "we have %d fields\n", mdb->num_fields);
 
       mdb->num_rows = PQntuples(mdb->result);
       Dmsg1(500, "we have %d rows\n", mdb->num_rows);
 
-      mdb->status = 0;
+      mdb->status = 0;                  /* succeed */
    } else {
-      Dmsg1(500, "we failed\n", query);
-      mdb->status = 1;
+      goto bail_out;
    }
 
    Dmsg0(500, "my_postgresql_query finishing\n");
+   return mdb->status;
 
+bail_out:
+   Dmsg1(500, "we failed\n", query);
+   PQclear(mdb->result);
+   mdb->result = NULL;
+   mdb->status = 1;                   /* failed */
    return mdb->status;
 }
 
 
 
 #undef  VERSION
 #define VERSION "2.1.11"
-#define BDATE   "01 June 2007"
-#define LSMDATE "01Jun07"
+#define BDATE   "02 June 2007"
+#define LSMDATE "02Jun07"
 
 #define PROG_COPYRIGHT "Copyright (C) %d-2007 Free Software Foundation Europe e.V.\n"
 #define BYEAR "2007"       /* year for copyright messages in progs */
 
               Technical notes on version 2.1
 
 General:
+02Jun07
+kes  Do better checking for NULL results returned from PostgreSQL;
+     implement retry for failed queries; clear results buffer after
+     failed query. Hopefully this will correct the PostgreSQL failures.
 01Jun07
 kes  Implement algorithm to handle only one appendable volume with
      Prefer Mounted Volumes = no.