http://people.apache.org/~wrowe/mod_isapi-416293.zip
+1 wrowe , fielding
- * Fix dbd merge_config function to support prepared statements
- PR#39386
- http://svn.apache.org/viewcvs.cgi?rev=396310&view=rev
- +1 niq, rpluem, fielding
-
* mod_cache: Do not overwrite the Content-Type in the cache, for
successfully revalidated cached objects. PR 39647.
Trunk version of patch:
I am willing to propose patches, but due to personal time
constraints they will not show up before the second half of July.
- * Fix virtualhost/per-directory configuration mismatch bug with
- possible segfault at server startup.
- http://mail-archives.apache.org/mod_mbox/httpd-dev/200607.mbox/<831327593.20060720023332%40engec.ru>
- (+ long thread)
- http://svn.apache.org/viewvc?view=rev&revision=424798
- +1 niq, rpluem, fielding
-
* mod_authn_alias: Add a check to make sure that the base provider
and the alias names are different and also that the alias has
not been registered before. PR#40051
cmd_min, cmd_keep, cmd_max, cmd_exp
} cmd_parts;
+static apr_hash_t *dbd_prepared_defns;
+
+/* a default DBDriver value that'll generate meaningful error messages */
+static const char *const no_dbdriver = "[DBDriver unset]";
#define ISINT(val) \
for (p = val; *p; ++p) \
DBD_DECLARE_NONSTD(void) ap_dbd_prepare(server_rec *s, const char *query,
const char *label)
{
- svr_cfg *svr = ap_get_module_config(s->module_config, &dbd_module);
dbd_prepared *prepared = apr_pcalloc(s->process->pool, sizeof(dbd_prepared));
prepared->label = label;
prepared->query = query;
- prepared->next = svr->prepared;
- svr->prepared = prepared;
+ prepared->next = apr_hash_get(dbd_prepared_defns, s->server_hostname,
+ APR_HASH_KEY_STRING);
+ apr_hash_set(dbd_prepared_defns, s->server_hostname, APR_HASH_KEY_STRING,
+ prepared);
}
static const char *dbd_prepare(cmd_parms *cmd, void *cfg, const char *query,
const char *label)
svr_cfg *base = (svr_cfg*) BASE;
svr_cfg *add = (svr_cfg*) ADD;
svr_cfg *cfg = apr_pcalloc(pool, sizeof(svr_cfg));
- cfg->name = strcmp(add->name, "") ? add->name : base->name;
+ cfg->name = (add->name != no_dbdriver) ? add->name : base->name;
cfg->params = strcmp(add->params, "") ? add->params : base->params;
cfg->persist = (add->persist == -1) ? base->persist : add->persist;
#if APR_HAS_THREADS
cfg->exptime = (add->set&EXPTIME_SET) ? add->exptime : base->exptime;
#endif
cfg->set = add->set | base->set;
+ cfg->prepared = (add->prepared != NULL) ? add->prepared : base->prepared;
return (void*) cfg;
}
/* A default nmin of >0 will help with generating meaningful
static void *dbd_cfg(apr_pool_t *p, server_rec *x)
{
svr_cfg *svr = (svr_cfg*) apr_pcalloc(p, sizeof(svr_cfg));
- svr->name = svr->params = ""; /* don't risk segfault on misconfiguration */
+ svr->params = ""; /* don't risk segfault on misconfiguration */
+ svr->name = no_dbdriver; /* to generate meaningful error messages */
svr->persist = -1;
#if APR_HAS_THREADS
svr->nmin = DEFAULT_NMIN;
*db = rec;
rv = dbd_prepared_init(rec->pool, svr, rec);
if (rv != APR_SUCCESS) {
+ const char *errmsg = apr_dbd_error(rec->driver, rec->handle, rv);
ap_log_perror(APLOG_MARK, APLOG_CRIT, rv, rec->pool,
- "DBD: failed to initialise prepared SQL statements");
+ "DBD: failed to initialise prepared SQL statements: %s",
+ (errmsg ? errmsg : "[???]"));
}
return rv;
}
}
#endif
+static int dbd_pre_config(apr_pool_t *p, apr_pool_t *plog, apr_pool_t *ptemp)
+{
+ dbd_prepared_defns = apr_hash_make(ptemp);
+ return OK;
+}
+static int dbd_post_config(apr_pool_t *pconf, apr_pool_t *plog,
+ apr_pool_t *ptemp, server_rec *s)
+{
+ svr_cfg *svr;
+ server_rec *sp;
+ for (sp = s; sp; sp = sp->next) {
+ svr = ap_get_module_config(sp->module_config, &dbd_module);
+ svr->prepared = apr_hash_get(dbd_prepared_defns, sp->server_hostname,
+ APR_HASH_KEY_STRING);
+ }
+ return OK;
+}
static void dbd_hooks(apr_pool_t *pool)
{
#if APR_HAS_THREADS
APR_REGISTER_OPTIONAL_FN(ap_dbd_cacquire);
APR_REGISTER_OPTIONAL_FN(ap_dbd_prepare);
apr_dbd_init(pool);
+ ap_hook_pre_config(dbd_pre_config, NULL, NULL, APR_HOOK_MIDDLE);
+ ap_hook_post_config(dbd_post_config, NULL, NULL, APR_HOOK_MIDDLE);
}
module AP_MODULE_DECLARE_DATA dbd_module = {