/*
* 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.