Here is the patch I am currently using to build Bacula to support PostgreSQL
under 5.2.6.
Jonathan Wright
Senior IT Ops Engineer
t: +44 20 7117 0809
m:
blinkbox music - the easiest way to listen to the music you love, for free
www.blinkboxmusic.com
--- a/src/cats/sql_update.c
+++ b/src/cats/sql_update.c
@@ -250,11 +250,30 @@ db_update_client_record(JCR *jcr, B_DB *mdb, CLIENT_DBR *cr)
int db_update_counter_record(JCR *jcr, B_DB *mdb, COUNTER_DBR *cr)
{
char esc[MAX_ESCAPE_NAME_LENGTH];
+ /* See Bug #1859
+ * Special update query for MySQL:
+ * MinValue and MaxValue are invalid unless qualified as
+ * Counters.MinValue and Counters.MaxValuein MySQL.
+ * The qualified syntax is invalid SQL and fails for other DBMS.
+ */
+ const char fmt_generic[] =
+ "UPDATE Counters SET "
+ "MinValue=%d,MaxValue=%d,CurrentValue=%d,WrapCounter='%s'"
+ "WHERE Counter='%s'";
+ const char fmt_mysql[] =
+ "UPDATE Counters SET "
+ "Counters.MinValue=%d,Counters.MaxValue=%d,CurrentValue=%d,WrapCounter='%s'"
+ "WHERE Counter='%s'";
+ const char *fmt = NULL;
+
db_lock(mdb);
mdb->db_escape_string(jcr, esc, cr->Counter, strlen(cr->Counter));
- Mmsg(mdb->cmd,
-"UPDATE Counters SET Counters.MinValue=%d,Counters.MaxValue=%d,CurrentValue=%d,"
-"WrapCounter='%s' WHERE Counter='%s'",
+ if(mdb->db_get_type_index() == SQL_TYPE_MYSQL) {
+ fmt = fmt_mysql;
+ } else {
+ fmt = fmt_generic;
+ }
+ Mmsg(mdb->cmd, fmt,
cr->MinValue, cr->MaxValue, cr->CurrentValue,
cr->WrapCounter, esc);
--- a/src/cats/sql_create.c
+++ b/src/cats/sql_create.c
@@ -646,6 +646,26 @@
COUNTER_DBR mcr;
int stat;
+ /* See Bug #1859
+ * Special update query for MySQL:
+ * MinValue and MaxValue are invalid unless qualified as
+ * Counters.MinValue and Counters.MaxValuein MySQL.
+ * The qualified syntax is invalid SQL and fails for other DBMS.
+ */
+ const char fmt_generic[] =
+ "INSERT INTO Counters (Counter,MinValue,MaxValue,CurrentValue,WrapCounter) "
+ "VALUES ('%s','%d','%d','%d','%s')";
+ const char fmt_mysql[] =
+ "INSERT INTO Counters (Counter,Counters.MinValue,Counters.MaxValue,CurrentValue,WrapCounter) "
+ "VALUES ('%s','%d','%d','%d','%s')";
+ const char *fmt = NULL;
+
+ if(mdb->db_get_type_index() == SQL_TYPE_MYSQL) {
+ fmt = fmt_mysql;
+ } else {
+ fmt = fmt_generic;
+ }
+
db_lock(mdb);
memset(&mcr, 0, sizeof(mcr));
bstrncpy(mcr.Counter, cr->Counter, sizeof(mcr.Counter));
@@ -656,8 +676,7 @@
}
mdb->db_escape_string(jcr, esc, cr->Counter, strlen(cr->Counter));
/* Must create it */
- Mmsg(mdb->cmd, "INSERT INTO Counters (Counter,Counters.MinValue,Counters.MaxValue,CurrentValue,"
- "WrapCounter) VALUES ('%s','%d','%d','%d','%s')",
+ Mmsg(mdb->cmd, fmt,
esc, cr->MinValue, cr->MaxValue, cr->CurrentValue,
cr->WrapCounter);