Hi all,

I've been trying to use the APR-util DBD API (v1.3.2) while writing an Apache 2.2 module, and I've run into a problem with my code and prepared statements, which I really don't understand. I've been taking inspiration from Apache's mod_dbd module, and so I'm slightly at a loss as to why there would be a problem. The offending code fragment:

fprintf(stderr, "DBINFO: %p %p %d\n", dbinfo->driver, dbinfo->handle, rv);
rv = apr_dbd_prepare(dbinfo->driver, prepared_pool, dbinfo->handle, query, NULL, &stmt);
if (rv) {
  fprintf(stderr, "DBINFO: %p %p %d\n", dbinfo->driver, dbinfo->handle, rv);
  const char *dberrmsg = apr_dbd_error(dbinfo->driver, dbinfo->handle, rv);
  ap_log_error(APLOG_MARK, APLOG_ERR, rv, cmd->server,
               "DBD: failed to prepare SQL statements: %s",
               (dberrmsg ? dberrmsg : "[???]"));
  // free the temporary sub-pool
  return "Failed to prepare SQL statement";

This all appears to work fine if the statement is valid. If there is a problem (e.g. a syntax error in the SQL) then apr_dbd_prepare() seems to destroy its driver and handle arguments, as shown by the fprintf() output:

DBINFO: 0xb7b3adc0 0x819fb30 0
DBINFO: 0x81ba928 (nil) 1064

I don't quite see how it can do this though! In any case, the code I have used is virtually identical to that used by mod_dbd, which doesn't seem to have this trouble. What have I missed? Let me know if you need more context.


Dave Ingram